Paso de parámetros a una subrutina por medio de typeglobs

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

Paso de un Fichero sin Prefijo como Typeglob

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);

Paso de un Fichero sin Prefijo como Referencia a un Typeglob

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 Módulo IO::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;



Subsecciones
Casiano Rodríguez León
2009-10-04