206 Stimmen

Was ist der Unterschied zwischen "my" und "our" in Perl?

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 ?

235voto

Fran Corpier Punkte 2851

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:

  • privat
  • neu
  • nicht global
  • getrennt von jedem Paket, so dass die Variable no puede werden in Form von $package_name::variable .

Andererseits, our Variablen sind Paketvariablen und daher automatisch:

  • weltweit Variablen
  • definitiv nicht privat
  • nicht unbedingt neu
  • puede außerhalb des Pakets (oder des lexikalischen Bereichs) mit der Option qualifizierten Namespace zugegriffen werden, da $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.

67voto

bubaker Punkte 2249

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.

51voto

FMc Punkte 40706

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";

11voto

daotoad Punkte 26089

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.

6voto

Ólafur Waage Punkte 66497

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.com

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.

Powered by:

X