2010-09-02 19 views

Respuesta

14

Puede considerar our para crear un alias con léxico a una variable global de paquete. Los paquetes globales son accesibles desde cualquier lugar; eso es lo que los hace globales. Pero el nombre creado por our solo es visible dentro del alcance léxico de la declaración our.

package A; 
use strict; 
{ 
    our $var; # $var is now a legal name for $A::var 
    $var = 42; # LEGAL 
} 

say $var; # ILLEGAL: "global symbol $var requires explicit package name" 
say $A::var; # LEGAL (always) 

{ 
    our $var; # This is the same $var as before, back in scope 
    $var *= 2; # LEGAL 
    say $var; # 84 
} 
+1

Gracias, ahora entiendo. –

+0

Realmente es un alias, si solo fuera una excepción a 'strict', entonces' perl -le 'our $ foo = 42; paquete A; print "$ foo $ main :: foo" ' 42 42' imprimiría lo mismo que 'perl -le 'use vars qw/$ foo /; $ foo = 42; paquete A; imprime "$ foo $ main :: foo" '', que es una exención, y no necesitaríamos' our'. –

+0

@Chas buen punto. – hobbs

7

Ya tiene una buena respuesta, pero quizás esto sea útil también. La declaración our combina aspectos de my y use vars. Funciona de manera similar a use vars en que declara variables de paquete; sin embargo, las variables declaradas de esta forma tienen un alcance léxico y no se puede acceder fuera del ámbito en el que se declararon (a menos que use el nombre completo de la variable). Además, una variable declarada con our es visible en todo su alcance léxico, , incluso a través de los límites del paquete.

Aquí hay una tabla que agregué a mis notas de Perl hace un tiempo. Para un ejemplo, vea this SO answer.

   Scope/  Package 
       Namespace Variable Private New 
--------------------------------------------------- 
my   Lexical No   Yes  Yes 
our   Lexical Yes   No   No 
use vars  Package Yes   No   No 
+3

La gente tiene que recordar que los paquetes no crean un alcance: [Sepa qué crea un alcance] (http://www.effectiveperlprogramming.com/blog/48). –

+0

@brian Entiendo su punto, y el artículo que escribió es bueno, pero me pregunto si los paquetes tienen ciertas características similares a las del alcance. Por ejemplo: paquete 'perl -le 'Foo; $ x + = 10; imprimir $ x; paquete B; $ x + = 10; imprimir $ x''. Tal vez hay una palabra mejor que "alcance" para describir lo que está pasando con ese ejemplo? Gracias por el aporte. – FMc

+0

La mejor palabra es "paquete predeterminado". Sin embargo, el paquete no limita la visibilidad de las variables. No es en absoluto como un alcance. –

Cuestiones relacionadas