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 hash
es 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