Ich weiß, was my
ist in Perl. Sie definiert eine Variable, die nur in dem Bereich des Blocks existiert, in dem sie definiert ist. Was bedeutet our
tun?
Wie funktioniert our
abweichen von my
?
Ich weiß, was my
ist in Perl. Sie definiert eine Variable, die nur in dem Bereich des Blocks existiert, in dem sie definiert ist. Was bedeutet our
tun?
Wie funktioniert our
abweichen von my
?
Wie funktioniert our
abweichen von my
und was bedeutet our
tun?
Zusammengefasst:
Verfügbar seit Perl 5, my
ist eine Möglichkeit, Nicht-Paket-Variablen zu deklarieren, die:
$package_name::variable
.Andererseits, our
Variablen sind Paketvariablen und daher automatisch:
$package_name::variable
.Deklaration einer Variablen mit our
können Sie Variablen vordeklarieren, um sie unter use strict
ohne Tippfehlerwarnungen oder Kompilierfehler zu erhalten. Seit Perl 5.6 hat es das veraltete use vars
die nur dateispezifisch war und nicht lexikalisch, wie es bei our
.
Zum Beispiel ist der formale, qualifizierte Name für die Variable $x
innerhalb package main
est $main::x
. Erklären our $x
ermöglicht es Ihnen, die bloße $x
Variable im Geltungsbereich der Deklaration straffrei (d. h. ohne einen daraus resultierenden Fehler), wenn das Skript use strict
o use strict "vars"
. Der Umfang kann ein, zwei oder mehrere Pakete oder einen kleinen Block umfassen.
Die PerlMonks- und PerlDoc-Links von cartman und Olafur sind eine großartige Referenz - hier ist mein Versuch einer Zusammenfassung:
my
Variablen sind lexikalisch innerhalb eines einzelnen Blocks, der durch {}
oder innerhalb der gleichen Datei, wenn nicht in {}
s. Sie sind von Paketen/Unterprogrammen, die außerhalb desselben lexikalischen Bereichs/Blocks definiert sind, nicht zugänglich.
our
Variablen werden innerhalb eines Pakets/einer Datei zugewiesen und sind von jedem Code aus zugänglich, der use
o require
dass Paket-/Dateinamenskonflikte zwischen Paketen durch Voranstellen des entsprechenden Namensraums aufgelöst werden.
Nur um das Ganze abzurunden, local
Variablen sind "dynamisch" skaliert und unterscheiden sich von my
Variablen, da sie auch von Unterprogrammen, die innerhalb desselben Blocks aufgerufen werden, zugänglich sind.
Ein Beispiel:
use strict;
for (1 .. 2){
# Both variables are lexically scoped to the block.
our ($o); # Belongs to 'main' package.
my ($m); # Does not belong to a package.
# The variables differ with respect to newness.
$o ++;
$m ++;
print __PACKAGE__, " >> o=$o m=$m\n"; # $m is always 1.
# The package has changed, but we still have direct,
# unqualified access to both variables, because the
# lexical scope has not changed.
package Fubb;
print __PACKAGE__, " >> o=$o m=$m\n";
}
# The our() and my() variables differ with respect to privacy.
# We can still access the variable declared with our(), provided
# that we fully qualify its name, but the variable declared
# with my() is unavailable.
print __PACKAGE__, " >> main::o=$main::o\n"; # 2
print __PACKAGE__, " >> main::m=$main::m\n"; # Undefined.
# Attempts to access the variables directly won't compile.
# print __PACKAGE__, " >> o=$o\n";
# print __PACKAGE__, " >> m=$m\n";
# Variables declared with use vars() are like those declared
# with our(): belong to a package; not private; and not new.
# However, their scoping is package-based rather than lexical.
for (1 .. 9){
use vars qw($uv);
$uv ++;
}
# Even though we are outside the lexical scope where the
# use vars() variable was declared, we have direct access
# because the package has not changed.
print __PACKAGE__, " >> uv=$uv\n";
# And we can access it from another package.
package Bubb;
print __PACKAGE__, " >> main::uv=$main::uv\n";
Umgang mit Scoping ist ein guter Überblick über die Perl-Scoping-Regeln. Es ist alt genug, dass our
wird im Hauptteil des Textes nicht behandelt. Sie wird angesprochen im Abschnitt Anmerkungen am Ende des Abschnitts.
Der Artikel spricht über Paketvariablen und den dynamischen Geltungsbereich und wie sich dieser von lexikalischen Variablen und dem lexikalischen Geltungsbereich unterscheidet.
Le site perldoc hat eine gute Definition von "unser".
Im Gegensatz zu my, das sowohl Speicher für eine Variable zuweist als auch einen einfachen Namen mit diesem Speicher für die Verwendung innerhalb des aktuellen Bereichs assoziiert, assoziiert our einen einfachen Namen mit einer Paketvariablen im aktuellen Paket für die Verwendung innerhalb des aktuellen Bereichs. Mit anderen Worten: our hat die gleichen Scoping-Regeln wie my, erzeugt aber nicht unbedingt eine Variable.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.