Extienda la clase Farm::Machine en el módulo Farm::Simple presentado en la sección 3.14.4 con métodos que implanten comandos Unix:
$beowulf->ls('-la');
Si se llama en un contexto void
el
método usará los atributos stdout
y stderr
del objeto
Farm::Machine para volcar allí los correspondientes flujos del comando.
Si se llama en un contexto escalar retornará la salida del comando.
Si se llama en un contexto de lista retornará ambos flujos:
my ($out, $err) = $beowulf->ls('-la');
Cuando se llama a una subrutina, es posible detectar si se esperaba un valor escalar, una lista o nada. Estas posibilidades definen tres contextos en los cuales una subrutina puede ser llamada. Por ejemplo:
$beowulf->ls(@files); # contexto void $listed = $beowulf->ls(@files); # contexto escalar @missing = $beowulf->ls(@files); # contexto de lista ($f1, $f2) = $beowulf->ls(@files); # contexto de lista print ($beowulf->ls(@files)); # contexto de lista
Esta información puede obtenerse mediante la función wantarray . Esta función devuelve:
undef
si no se esperaba valor,
""
si se trata de un escalar,
1
si se trata de una lista.
Perl proporciona un medio
para crear una rutina ''captura-llamadas'' para cada paquete, la cuál será
llamada siempre que la rutina solicitada no exista. Su nombre debe ser
AUTOLOAD . Los parámetros que se le pasan a dicha subrutina serán
los mismos que se pasaron a la subrutina desaparecida.
Cuando se invoca a AUTOLOAD
, la variable (del paquete)
$AUTOLOAD
contiene el nombre de la rutina solicitada. De este modo
es posible conocer que rutina intentaba invocar el programa usuario.
El siguiente ejemplo muestra el uso de AUTOLOAD
para la creación automática de getter-setters:
sub AUTOLOAD { no strict "refs"; my $self = shift; if (($AUTOLOAD =~ /\w+::\w+::get(_.*)/) && ($self->_accesible($1,'read'))) { my $n = $1; return unless exists $self->{$n}; # Declarar el metodo get_***** *{$AUTOLOAD} = sub { return "(nuevo get) ".$_[0]->{$n}; }; return "(autoload) ".$self->{$n}; } elsif (($AUTOLOAD =~ /\w+::\w+::set(_.*)/) && ($self->_accesible($1,'write'))) { my $n = $1; return unless exists $self->{$n}; $self->{$n} = "(autoload) ".shift; # Declarar el metodo set_***** *{$AUTOLOAD} = sub { $_[0]->{$n} = "(nuevo set) ".$_[1]; }; } else { @_ = map { "\"".$_."\""; } @_; # Comillas a los argumentos... print "Has llamado a $AUTOLOAD(",join(", ",@_),")\n"; } }
Puede encontrar un ejemplo en http://nereida.deioc.ull.es/˜pp2/perlexamples/GRID-Machine-0.02.tar.gz.
Puede descargar la distribución descrita en la secció anterior desde el enlace http://nereida.deioc.ull.es/˜pp2/perlexamples/Farm-Simple-0.2.tar.gz