Perl 5.6.0 introdujo la declaración our que permite declarar variables de paquete. Un paquete es un espacio de nombres.
Una declaración package cambia el ''espacio de nombres''
hasta que encontremos una nueva declaración package
,
o hasta el final del bloque actual.
El package
inicial es el package main.
Cuando sea necesario hacer explícito a que package
pertenece
una variable se prefija su nombre con el del
package
, separado por ::
.
Una $variable
declarada con our
en el paquete $nombre::de::paquete
es accesible desde cualquier fichero
y desde cualquier paquete vía su nombre completo: $nombre::de::paquete::variable
.
Veamos un ejemplo:
package C110; # estamos en el espacio de nombres C110 our $a = 5; # variable del paquete C110 fun1 # función del paquete C110 { print "$a\n"; } package D110; # ahora estamos en el espacio de nombres D110 # ...salimos del paquete C110 our $a = 7; # esta $a es del paquete D110 print $a; # imprime 7 print $C110::a; # imprime 5 # note como podemos acceder el espacio de nombres C110... # note el $ y los :: C110::fun1; # llama a fun1 de C110...imprime: 5
Asi pues, para acceder a un identificador situado en un
espacio de nombres diferente del actual debemos
prefijar el identificador con el nombre del paquete;
esto se denomina especificación completa del nombre o
fully qualifying the name.
Si un identificador no está completamente especificado,
Perl lo busca en el package
actual.
Una declaración our $x
hace que $x
sea
visible en el ámbito léxico. Por ejemplo el siguiente programa
es considerado sintácticamente incorrecto:
nereida:/home/lhp/projects/perl/src# cat -n our2.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 sub tutu { 5 $x = 5; 6 print "$x\n"; 7 } 8 9 our $x = 4; 10 tutu(); 11 print "$x\n";Al compilar obtenemos errores que indican que
$x
no ha sido
declarada antes del uso:
nereida:/home/lhp/projects/perl/src# perl -c our2.pl Global symbol "$x" requires explicit package name at our2.pl line 5. Global symbol "$x" requires explicit package name at our2.pl line 6.Para convertirlo en un programa correcto debemos declarar
$x
antes de su uso, por ejemplo en la línea 3.
Vamos, sin embargo, a hacer algo mas extraño:
nereida:/home/lhp/projects/perl/src# cat -n our.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 sub tutu { 5 our $x = 5; 6 print "$x\n"; 7 } 8 9 our $x = 4; 10 tutu(); 11 print "$x\n";Sólo hay una variable
$x
en el paquete actual. La declaración
de la línea 5 ''hace visible'' $x
en las líneas 5-7, pero
es la misma variable que se declara en la línea 9.
El programa produce la salida:
nereida:/home/lhp/projects/perl/src# our.pl 5 5
Otra forma de reconvertir el programa en sintácticamente correcto es hacer uso del nombre completo de la variable:
lhp@nereida:~/projects/perl/src$ cat -n our3.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 sub tutu { 5 $main::x = 5; 6 print "$main::x\n"; 7 } 8 9 our $x = 4; 10 tutu(); 11 print "$x\n";El paquete en el que reside el programa principal se denomina
main::
lhp@nereida:~/projects/perl/src$ perl -c our3.pl our3.pl syntax OK