Typeglobs Selectivos

Al asignar una referencia a un typeglob se obtiene un Typeglob Selectivo:
*SOURCE = \$SOURCE1;
*args = \@ARGV;
*do_it = sub { print "do it!\n" };
La primera asignación hace que $SOURCE sea un sinónimo de $SOURCE1, pero @SOURCE, %SOURCE y &SOURCE continúan con sus anteriores valores.

Del mismo modo @args es un sinónimo de @ARGV pero no de $ARGV y do_it es el nombre de una subrutina que inicialmente era anónima.

Referencias a Typeglobs

Es legal tomar una referencia a un ''typeglob''. Por ejemplo:

  DB<1> $a = 4; @a = 1..5
  DB<2> $b = \*a
  DB<3> x $b
0  GLOB(0x8450df8)
   -> *main::a
  DB<4> x ${*$b}
0  4
  DB<5> x @{*$b}
0  1
1  2
2  3
3  4
4  5

Veamos otro ejemplo:

lhp@nereida:~/Lperl/src$ perl -wde 0
main::(-e:1):   0
  DB<1> %variable = (v => "ven", a => "a", r=> "rumania")
  DB<2> sub variable { print "esto es una variable" }
  DB<3> $typeglob_ref = \*variable

Ahora typeglob_ref contiene una referencia a la entrada en la tabla de símbolos para variable. Podemos acceder a los elementos individuales a través de la referencia:

  DB<4> x %{*$typeglob_ref}
0  'r'
1  'rumania'
2  'a'
3  'a'
4  'v'
5  'ven'
  DB<5> x &{*$typeglob_ref}()
0  1
  DB<6> x *$typeglob_ref->()
0  1
  DB<7> x *$typeglob_ref->{r}
0  'rumania'

Ejercicio 4.15.3   ¿Por que no sale por pantalla el mensaje "esto es una variable" en las líneas 5,6 y 7? ¿Por que la respuesta es "1"?

Referencias a Ficheros (Barewords)

En la sección 4.15.5 abordabamos el problema de los ficheros como argumentos de una subrutina. El código puede ser reescrito como sigue:
lhp@nereida:~/Lperl/src$ cat -n ./fileparameter2.pl
   1  #!/usr/bin/perl -w
   2  use strict;
   3
   4  sub welcome {
   5    my $fh = shift;
   6
   7    print $fh "Welcome ...\n";
   8  }
   9
  10  open(FILE, ">test.txt");
  11  my $file = \*FILE;
  12  welcome($file);
  13  close($file);
lhp@nereida:~/Lperl/src$ ./fileparameter2.pl
lhp@nereida:~/Lperl/src$ cat test.txt
Welcome ...

Ejercicio 4.15.4   ¿Que se imprimirá al ejecutar el siguiente código?
#!/usr/local/bin/perl5.8.0 -w
sub mundo { "mundo\n" }

*hola = \&mundo;
$mundo = "hola";
$hola = "bienvenido";
print "$mundo ",&hola();



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