La declaración our

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

Nombre Completo

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.

Visibilidad Léxica de our

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

Los Accesos con Nombre Completo son Aceptados por el Compilador

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



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