Argumentos con Nombre

En Perl es posible escribir una subrutina que soporte llamada de argumentos con nombre. La idea es ''enrollar'' los argumentos de la subrutina en un hash. Supongamos que queremos escribir una subrutina listdir 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:

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.
}

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
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=43.
2012-06-19