2013-07-17 4 views

Antwort

5

Ja, our Deklarationen können zusätzliche Funktionen haben, wenn sie mit nicht deklarierten Globalen verglichen werden. Aber diese sind weitgehend irrelevant.

our erstellt einen lexikalischen Alias ​​für eine globale Variable (mit demselben Namen). Das heißt, in package Foo, our $bar und $Foo::bar beziehen sich auf die gleiche Variable. Allerdings ist ersteres nur in einem engen lexikalischen Umfang verfügbar.

Wie our eine lexikalische Wirkung hat, auch die Alias-lexikalische Variablen mit my Schatten kann:

our $foo = 42; # give some value 
my $foo = -1; # same name, different value 
say "my gives $foo"; 
our $foo;  # reintroduce the alias; shadow lexical 
say "our gives $foo"; 

Wenn Sie die our Erklärungen abzustreifen und es ohne strenge laufen, wird dies offensichtlich nicht geben den Ausgang

Genau wie my, our kann ein bisschen zusätzliche Deklaration Syntax, zAttribute:

use threads::shared; 
our $foo :shared; 

Sie auch eine Art für die Verwendung mit dem fields Pragma angeben:

our Foo $foo; 

Dies kann nicht für globale Variablen ohne our erfolgen.

+0

Wirklich eine gute Antwort! – none

2

Wie Sie aus den perldocs sehen können, schafft our eine Alias ​​zu einem Paket Variable mit dem gleichen Namen wie der our ed Variable im aktuellen Paket.

Wenn Sie Code schreiben, der mehrere Paketdefinitionen enthält, können Sie eine our ed-Variable verwenden, um eine Alias-Variable zwischen Modulen zu übergeben.

package Foo: 
our $bar = 42; # $bar is an alias for $Foo::bar 

package Baz; 
print $bar;  # prints '42', since $bar is $Foo::bar 

Also eine Verwendung, die nichts mit globalen Variablen zu tun hat.

+1

Alle Paketvariablen sind globale Variablen. Was dieser Gebrauch zeigt, ist, dass es einen Sinn für "unser" gibt, abgesehen davon, dass er "streng" erfüllt. – darch

+0

Gemäß der folgenden Frage (http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl) werden unsere Variablen als Paket- und globale Variablen bezeichnet. Ich weiß nicht, wer glaubt. – none

+0

@none: Hier gibt es keinen Konflikt. 'unser' deklariert (ein Alias ​​für) Paket (globale) Variablen. – Borodin

2

Globale, Paketvariablen sind überall zugänglich, ob strict vorhanden ist oder nicht, wenn Sie den vollständig qualifizierten Namen angeben, d. H. Sie geben ihm den Paketnamen als Präfix an. So kann ich jederzeit auf $main::variable zugreifen.

Ohne strict, wenn Sie auf $variable zugreifen, die Sie nicht mit my deklariert haben, geht Perl davon aus, dass es sich um eine Paketvariable im aktuellen Paket handelt. our kann verwendet werden, um explizit eine Paketvariable zu deklarieren, aber ohne strict tut es nicht viel, da sich alles, was nicht deklariert wird, genauso verhält.

Mit strict sind Variablen, die mit our deklariert sind, über ihren lokalen Namen und ihren vollständig qualifizierten Namen im lexikalischen Bereich zugänglich, in dem die Deklaration angezeigt wurde. Das bedeutet, dass Sie für den Zugriff auf eine globale Variable aus zwei Subroutinen entweder in beiden Subroutinen deklarieren oder vor beiden in einem äußeren Bereich deklarieren müssen.

Verwandte Themen