2010-09-02 6 views

Antwort

14

Sie können our erwägen, einen lexikalischen Gültigkeitsbereich alias zu einer globalen Paketvariablen zu erstellen. Paket Globals sind von überall zugänglich; Das macht sie global. Aber der Name, der von our erstellt wird, ist nur innerhalb des lexikalischen Bereichs der our Deklaration sichtbar.

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

Danke, ich verstehe jetzt. –

+0

Es ist wirklich ein Alias, wenn es nur eine Ausnahme zu 'strict' dann' perl -le 'unser $ foo = 42; Paket A; print "$ foo $ main :: foo" ' 42 42 "würde dasselbe wie' perl -le 'ausgeben vars qw/$ foo /; $ foo = 42; Paket A; print "$ foo $ main :: foo" '', was eine Ausnahme ist, und wir würden' unser' nicht brauchen. –

+0

@Chat einen guten Punkt. – hobbs

7

Sie haben eine gute Antwort bereits, aber vielleicht wird dies auch hilfreich sein.

Die our Deklaration kombiniert Aspekte von my und use vars. Es funktioniert ähnlich wie use vars, indem es Paketvariablen deklariert; Auf diese Weise deklarierte Variablen sind jedoch lexikalisch begrenzt und können nicht außerhalb des Bereichs aufgerufen werden, in dem sie deklariert wurden (es sei denn, Sie verwenden den vollständig qualifizierten Namen der Variablen). Darüber hinaus ist eine mit our deklarierte Variable über ihren gesamten lexikalischen Gültigkeitsbereich sichtbar, sogar über Paketgrenzen.

Hier ist eine Tabelle, die ich vor einiger Zeit zu meinen Perl-Notizen hinzugefügt habe. Ein Beispiel finden Sie unter 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

Leute müssen daran denken, dass Pakete keinen Bereich erstellen: [Wissen, was einen Bereich erstellt] (http://www.effectiveperlprogramming.com/blog/48). –

+0

@brian Ich nehme Ihren Punkt, und der Artikel, den Sie geschrieben haben, ist ein guter, aber ich frage mich, ob Pakete bestimmte Umfang-ähnliche Eigenschaften haben. Zum Beispiel: 'perl -le 'Paket Foo; $ x + = 10; Druck $ x; Paket B; $ x + = 10; Druck $ x''. Vielleicht gibt es ein besseres Wort als "Geltungsbereich", um zu beschreiben, was mit diesem Beispiel passiert? Danke für die Eingabe. – FMc

+0

Das bessere Wort ist "Standardpaket". Das Paket beschränkt die Sichtbarkeit der Variablen jedoch nicht. Es ist überhaupt nicht wie ein Zielfernrohr. –

Verwandte Themen