my %handler = ( QUIT => sub { exit( 0 ) }, EVAL => \&revaluate, STORE => \&rstore, CALL => \&rcall, DUMP => \&rdump, INSTALL => \&rinstall, ); while( 1 ) { my ( $operation, @args ) = read_operation( $readfunc ); my $handler = $handler{$operation}; if (defined($handler)) { $handler->(@args); next; } send_operation( $writefunc, "DIED", "Unknown operation $operation\nARGS: @args" ); }¿Que relación existe entre una tabla de saltos y una aproximación OOP al problema de los condicionales en cascada? ¿Que solución es mejor?
IPC::PerlSSH
si en medio de la ejecución de una rutina remota
se ejecuta un print
?
EVAL
son ejecutados en una subrutina
(líneas 95 y 101) afecta al ámbito de una declaración ours
:
92 if( $operation eq "EVAL" ) { 93 my $code = shift @args; 94 95 my $subref = eval "sub { $code }"; 96 if( $@ ) { 97 send_operation( $writefunc, "DIED", "While compiling code: $@" ); 98 next; 99 } 100 101 my @results = eval { $subref->( @args ) }; 102 if( $@ ) { 103 send_operation( $writefunc, "DIED", "While running code: $@" ); 104 next; 105 } 106 107 send_operation( $writefunc, "RETURNED", @results ); 108 next; 109 }¿Cómo puede solucionarse el problema de la ''modificación del ámbito''? ¿Es posible seguir declarando variables globales dentro de un eval? Comente la siguiente sesión con el depurador:
nereida:~/LEyapp> perl -wde 0 Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(-e:1): 0 DB<1> x eval '{ use strict; our $x = 4 }' 0 4 DB<2> x eval '{ use strict; print $x }' Variable "$x" is not imported at (eval 8)[(eval 7) line 1. 0 undef DB<3> x eval '{ use strict; our $x; print "$x\n" }' 4 0 1
eval
uado es mas complicada que la de un programa
guardado en un fichero. ¿Sabría explicar la causa? ¿Es posible guardar
el código en módulos, comprobar su correcta compilación y enviarlos después?
Consulte los módulos Module::Which y Module::ScanDeps :
nereida:~/src/perl/testing> perl -wde 0 main::(-e:1): 0 DB<1> use Module::Which DB<2> $info = which('Module::Which', 'YAML') DB<3> x $info 0 HASH(0x858f0f0) 'Module::Which' => HASH(0x85ab4cc) 'base' => '/usr/local/share/perl/5.8.8' 'path' => '/usr/local/share/perl/5.8.8/Module/Which.pm' 'pm' => 'Module::Which' 'version' => 0.0205 'YAML' => HASH(0x883be60) 'base' => '/usr/local/share/perl/5.8.8' 'path' => '/usr/local/share/perl/5.8.8/YAML.pm' 'pm' => 'YAML' 'version' => 0.62El módulo Module::ScanDeps permite el análisis de dependencias. Provee el ejecutable scandeps.pl :
nereida:~/src/perl/YappWithDefaultAction/examples> scandeps.pl Rule6.pm 'AutoLoader' => '5.63', 'Cwd' => '3.18', 'File::Spec::Unix' => '1.5', 'File::Spec' => '3.18', 'Parse::Eyapp::YATW' => 'undef', 'List::MoreUtils' => '0.21', 'Parse::Eyapp::Base' => 'undef', 'Parse::Eyapp::Node' => 'undef', 'Parse::Eyapp::Driver' => '1.069577',
bind
que provee una interfaz
local a la máquina remota. ¿Que desventajas y ventajas le ve a
este diseño de la API?
IPC::PerlSSH
de un servicio de llamada de procedimiento remota (RPC)
que no estuviera limitado a argumentos de tipo ''cadena''?
Esto es que se admitieran en el cliente Perl llamadas al servidor Perl
con estructuras anidadas (vea los ejemplos
examples/nested.pl
y
examples/nested2.pl
en la distribución
de
GRID-Machine-0.07.tar.gz
?
Al ejecutar este fragmento de código:
pp2@nereida:~/src/perl/GRID_Machine/examples$ sed -ne '18,27p' nested.pl | cat -n 1 $machine->sub( 2 rmap => q{ 3 my $f = shift; # function to apply 4 map { $f->($_) } @_; 5 }, 6 ); 7 8 my $cube = sub { $_[0]**3 }; 9 my @cubes = $machine->rmap($cube, 1..3)->Results; 10 { local $" = ','; print "(@cubes)\n"; }se obtiene la salida:
pp2@nereida:~/src/perl/GRID_Machine/examples$ nested.pl Linux orion 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 (1,8,27)Observe que la función pasada como parámetro
sub { $_[0]**3 }
es definida en la máquina local y llamada en la remota.
Makefile.PL
en la distribución
GRID-Machine-0.07.tar.gz
.
¿Que hace la función MY::postamble ?
put
get
a los objetos GRID::Machine
que permita la copia
de ficheros entre las dos máquinas. El método put
permite transferir ficheros de la máquina local a la máquina remota.
Por ejemplo:
$beo->put([ qw(file1 file2 file3) ]);copiaría los ficheros
file1
,
file2
y
file3
en el directorio actuál en la máquina remota.
Una llamada como:
$beo->put([ qw(file1 file2 file3) ], 'path');copiaría los ficheros
file1
,
file2
y
file3
en el directorio path
de la máquina remota.
Una fuente de inspiración puede ser el código del módulo
http://search.cpan.org/~ivan/Net-SCP/
.
Use File::Spec para escribir código independiente del sistema operativo.
Casiano Rodríguez León