Práctica: Introduciendo un Actor más en el Guión

Escriba un método keyboard para los objetos IO::Pty::Script que, cuando sea llamado desde un manejador de guión permita la interacción con el usuario. A partir de ese momento lo escrito por el usuario en el teclado se redirigirá al comando bajo control de la seudoterminal. Al pulsar una determinada secuencia de escape (pasada como parámetro a keyboard) se devuelve el control al guión. Sigue un ejemplo de como puede ser usado el método keyboard:
lhp@nereida:~/Lperl/src/perl_networking/ch2/IO-Pty-Script/script$ cat -n ptyconnect2.pl
 1  #!/usr/bin/perl -sw -I../lib
 2  use strict;
 3  use IO::Pty::Script qw(chat TIMEOUT DEFAULT_DEADLINE);
 4
 5  my %script;
 6  our($c, $d, $p, $f); # Inicializadas via -s switch
 7
 8  $p = '' unless defined($p);
 9  $d = DEFAULT_DEADLINE unless defined($d);
10  $f = '' unless defined($f);
11  die "Usage:$0 -c=command -p=key -d=deadline -f=script\n"
12                                        unless defined($c);
..  ...
41  $script{'ssh europa'} = [
42  $prompt => "$f\n",
43  $prompt => [\&titi, 1, 2, "tres"],
44  $prompt => sub { my $s = shift; $s->keyboard("\cD"); "ls\n" },
45  $prompt => "echo 'Despues de la interaccion'\n",
46  $prompt => "exit\n"
47  ];
48
..  ...
58  sub titi {
59    local $" = "\nsub titi:";
60    print "<<sub titi: @_>>\n";
61    "date\n";
62  }
63
..  ...
70
71  chat(command => $c, deadline => $d, script => $script{$c},
72       defaultaction => sub { print $_[0] } );
Al ejecutar el anterior programa deberíamos tener una salida parecida a esta:
lhp@nereida:~/Lperl/src/perl_networking/ch2/IO-Pty-Script/script$ ptyconnect2.pl -c='ssh europa' -d=1 -f='uname -a'
<<r = 'Linux europa.deioc.ull.es 2.4.20-ck2 #1 vie mar 28 17:32:02 WET 2003 i686 unknown

Most of the programs included with the Debian GNU/Linux system are
freely redistributable; the exact distribution terms for each program
are described in the individual files in /usr/share/doc/*/copyright

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have mail.
Last login: Tue May 16 13:01:13 2006 from nereida.deioc.ull.es
lhp@europa:~$ '
s = ''
d = '0'>>
<<sub titi: <<r = 'Linux europa.deioc.ull.es 2.4.20-ck2 #1 vie mar 28 17:32:02 WET 2003 i686 unknown
lhp@europa:~$ '
s = ''
d = '0'>>

sub titi:1
sub titi:2
sub titi:tres>>
echo "ESCRITO POR EL USUARIO"
ESCRITO POR EL USUARIO
lhp@europa:~$
lhp@europa:~$ <<r = '2003_2004                        Lkimwitu
alu                                   Llatex2html
article.pdf                           Lmoodle
bin                                   Lperl
bspgrid.pdf                           mail
bspphyton.pdf                         ml2sparser.ps
............                          .... # Salida omitida
lhp@europa:~$ '
^D                                         # Secuencia de escape pulsada
s = ''
d = '0'>>
<<r = 'Despues de la interaccion
lhp@europa:~$ '
s = ''
d = '0'>>
lhp@nereida:~/Lperl/src/perl_networking/ch2/IO-Pty-Script/script$
El método keyboard recibe como argumentos, además de la referencia al objeto la secuencia de escape que termina la interacción con el teclado y el valor a retornar por el manejador:
lhp@nereida:~/Lperl/src/perl_networking/ch2/IO-Pty-Script/lib/IO/Pty$ sed -ne '/sub keyboard/,228p' Script.pm | cat -n
 1  sub keyboard {
 2    my $self = shift;
 3    my $escape = shift;
 4    my $return_value = shift;
 5
..        ...
39  }

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19