Ya hemos visto que las referencias permiten el paso de estructuras anidadas a una subrutina, evitando el efecto del aplanamiento de listas. Las referencias simbólicas también proveen una forma alternativa (pero desaconsejada). Los typlegobs nos dan otra via (tampoco recomendable):
lhp@nereida:~/Lperl/src$ cat -n passbyref.pl 1 #!/usr/local/bin/perl 2 use strict; 3 use warnings; 4 5 sub sum { 6 our (@a, @b); 7 local (*a, *b) = @_; 8 9 $a[$_] += $b[$_] for 0..$#a; 10 } 11 12 our @c = 1..4; 13 our @d= 5..8; 14 15 sum(*c, *d); 16 print "@c\n";
Cuando se ejecuta, el programa anterior produce la salida:
lhp@nereida:~/Lperl/src$ ./passbyref.pl 6 8 10 12
Los manejadores de ficheros (filehandles) pueden ser usados sin declaración previa cuando se usan sin prefijo. En tal caso no se pueden asignar o pasar como parámetros, esto es, es ilegal hacer:
open(F,"fich1"); # Recomendado: open my $F, "fich1"; open(G,"fich2"); F = G;En los años A.R. (Antes de las Referencias) la alternativa era hacer una asignación de los typeglobs:
*F = *G
Lo mismo ocurría para el paso de ficheros como parámetros de una función. Vea el siguiente ejemplo:
lhp@nereida:~/Lperl/src$ cat -n fileparameter4.pl 1 #!/usr/bin/perl 2 use warnings; 3 use strict; 4 5 sub welcome { 6 local *FHANDLE = shift; 7 8 print FHANDLE "Welcome ...\n"; 9 } 10 11 open(FILE, ">test.txt"); 12 welcome(*FILE); 13 close(FILE);
Otra forma de pasar un manejador de fichero sin prefijo es usar una referencia a un typeglob:
#!/usr/bin/perl -w sub welcome { my $fh = shift; print $fh "Welcome ...\n"; } open(FILE, ">test.txt"); $file = *FILE; welcome($file); close($file);
El modo recomendado de uso de ficheros consiste en tratarlos como objetos de la clase IO::File
$ cat -n ./fileparameter3.pl 1 #!/usr/bin/perl -w 2 3 use IO::File; 4 5 sub welcome { 6 my $fh = shift; 7 8 print $fh "Welcome ...\n"; 9 } 10 11 $file = new IO::File "test.txt", "w"; 12 die "No pude abrir el fichero: $!" unless $file; 13 welcome($file); 14 $file->close;