Práctica: Extendiendo los Objetos Farm::Machine

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');

El Operador wantarray

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:

Captura de LLamadas Perdídas con AUTOLOAD

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";
    }
  }

La Distribución de GRID::Machine

Puede encontrar un ejemplo en http://nereida.deioc.ull.es/˜pp2/perlexamples/GRID-Machine-0.02.tar.gz.

La Distribución de Farm::Simple

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



Subsecciones
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