Quisiera dejar anotado en el blog, algunos detalles útiles que recuerdo aprendí finalmente cuando estuve programando en PERL para Straec Technologies.
A modo de manejo de conocimiento, y para que esto quede indexado en los buscadores, voy a anotar aqui algunas máximas, y detallitos bien utiles cuando estas programando algo grande, y necesitas pasar estructuras de datos mas complejas que variables… digamos, tienes que pasar un Arreglo de Hashes, o un Arreglo de Arreglos, o un Hash de Arreglos, o un Hash de Hashes…
Nota: Un hash es un arreglo asociativo en PHP, o lo analogo a un Hashmap o Hashtable en Java. En perl se definen asi:
my %hash; #se definen con el % adelante
$hash['direccion'] = "Casa #4, Calle 34 Oeste"; #Se usan como arreglos
$hash[nombre] = "Epale"; #No hace falta poner la clave en comillas
$hash[edad] = 12; #Pueden tener cualquier tipo de datos, incluyendo referencias a arreglos, u otros hashes
$hash[otroHash] = %otroHash; #Ej de referencia a un hash
%hash = {'direccion'=>'Una direccion', 'fecha'=>time()} #Creo que es asi la sintaxis para inicializarlo de una con varios elementos.
Todas estas cosas es mejor que las manejes con REFERENCIAS… que es algo asi como apuntadores. Si manejas bien las referencias, vas a entender mucho más fácil otras cosas en Perl.
1) Las funciones o “sub” rutinas en perl, pueden devolver arreglos, pero no pueden devolver hashes.
sub devuelveArreglo {
my @arreglo;
...
return @arreglo; #Esto funciona perfect
}
sub devuelveHash {
my %hash;
...
return %hash; #Esto no te va a funcionar si intentas agarrar el hash
}
#Tienes que devolver una referencia del hash
sub devuelveHash {
my %hash;
...
return \%hash; #Asi si!
}
#Luego utilizas la referencia del hash asi
my $ref_de_hash = devuelveHash();
my %hash = %$ref_de_hash; #Lo que nos lleva al próximo punto.
2) Como des-referenciar
my @arreglo = @$ref_arreglo;
my @hash = %$ref_hash;
my $variable = $$variable;
Simplemente se antepone el operador que representa el tipo de variable que estas des-referenciando. Sencillo. Y bueno, ya se vio que para crear referencias se utiliza el operador
3) Si tienes una funcion que recibe N variables y un arreglo. PON EL ARREGLO DE ULTIMO PARAMETRO
sub miFuncion {
my ($param1,$param2,...,$paramN,@paramArreglo) = (shift,shift,...,shift,shift);
}
Si la funcion debiera recibir 2 arreglos como hago????
Este es el momento de utilizar referencias. En vez de pasar 2 arreglos,
pasale a la funcion 2 referencias a arreglos. Esta puede ser la solucion si te parece que es más elegante poner el arreglo como primer parametro.
Del resto hay muchas otras lecciones con variables predeterminadas de PERL, pero esas las usas cuando estás programando, y son más que todo cosas que puedes encontrar en cualquier sitio web. A veces encontrar documentacion de Referencias y DesReferencias en Español me supongo que es dificil, asi que decidi documentar esto porque antes de irme de Straec finalmente entendí completamente como funcionaban las referencias, y me fueron muy utiles para hacer cosas complejas, ya que no estabamos utilizando un approach orientado a objetos, y todo se tenia que resolver fumandotela con arreglos y hashes.