next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Aliasing de los parámetros Sup: Subrutinas Ant: El pragma use strict Err: Si hallas una errata ...


Argumentos con Nombre

Perl soporta argumentos con nombre a traves de un truco ``astuto''. El truco es pretender que los argumentos de la subrutina forman un hash en vez de una lista. Por ejemplo, supongamos que queremos escribir una subrutina con una funcionalidad equivalente a ls y que toma un numeroso grupo de argumentos especificando las diferentes casuisticas. La ventaja de usar hashes es que no hay que especificar todos los argumentos en una llamada y no hay que preocuparse por el orden de los mismos:

listdir(cols=>4, page=>1, hidden=>1, sep_dirs=>1);

Dentro de la subrutina, simplemente inicializamos un hash con los contenidos del array @_ resultante. De este modo podemos acceder a los argumentos a través de su nombre, utilizando cada nombre como clave de entrada en el hash. Por ejemplo:

sub listdir {
  %arg = @_; # convierte la lista de argumentos en un hash
  # Utilizamos valores por defecto para los argumentos desaparecidos
  $arg{match} = "*" unless exists $arg{match};
  $arg{cols}  =  1  unless exists $arg{cols};
  # etc.

  # Utilizamos los argumentos para controlar la conducta ...
  @files = get_files($arg{match});
  push @files, get_hidden_files() if $arg{hidden};
  # etc.
}

Otra ventaja es que, si tenemos varias llamadas que requieren el mismo conjunto de argumentos, podemos almacenarlos en un hash separado y reutilizarlo:

%std_listing = (cols=>2, page=>1, sort_by=>"date");
listdir(file=>"*.txt", %std_listing);
listdir(file=>"*.log", %std_listing);
listdir(file=>"*.dat", %std_listing);

Esta idea de un conjunto de argumento estándar, sobreescrito por argumentos especificados explícitamente puede ser utilizando dentro de una subrutina para simplificar el manejo de los valores por defecto. Por ejemplo:

sub listdir {
  %defaults = (match =>"*", cols=>1, sort_by=>"name");
  %arg = (%defaults, @_);

  #etc.
}

Una posible optimización es mover el hash defaults fuera de la subrutina listdir, de manera que su inicialización se haga una sola vez:

%defaults = (match =>"*", cols=>1, sort_by=>"name");
  
sub listdir {
  %arg = (%defaults, @_);
  #etc.
}


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Aliasing de los parámetros Sup: Subrutinas Ant: El pragma use strict Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21