Wird der Modifizierer our
nur verwendet, wenn striktes Pragma aktiv ist, um globale Variablen verwenden zu lassen, oder wird es sogar für einige zusätzliche Funktionen verwendet, die sich von normalen globalen Variablen unterscheiden, wenn strict ausgeschaltet ist?Gibt es Unterschiede zwischen unseren definierten Variablen und normalen globalen Variablen in Perl?
Gibt es Unterschiede zwischen unseren definierten Variablen und normalen globalen Variablen in Perl?
Antwort
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.
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.
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
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
@none: Hier gibt es keinen Konflikt. 'unser' deklariert (ein Alias für) Paket (globale) Variablen. – Borodin
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.
- 1. Gibt es Unterschiede zwischen deklarieren Variablen normalerweise in Express?
- 2. Gibt es einen Unterschied zwischen einer globalen Variablen und einer Eigenschaft des globalen Objekts
- 3. Gibt es in Ruby eine Möglichkeit, alle globalen Variablen und definierten/vordefinierten Konstanten auszudrucken?
- 4. Problem mit globalen Variablen
- 5. Unterschied zwischen lokalen und globalen Variablen in Javascript?
- 6. Welche globalen Variablen beeinflussen die Testoperatoren -e, -d in Perl?
- 7. codeigniter Frage globalen Variablen
- 8. Actionscript3: Gibt es Variablen?
- 9. JavaScript globalen Variablen und selbstaufrufenden anonymen Funktionen
- 10. Dynamische Variablen in Perl
- 11. Ist es richtig, die globalen Variablen des Perl-Moduls direkt zu bekommen und speziell zu setzen?
- 12. C++ Leistung von globalen Variablen
- 13. Perl Variablen Unteilbarkeit und Sichtbarkeit
- 14. Wie keine globalen Variablen in c
- 15. Share Variablen zwischen Funktionen in PHP ohne Verwendung von globalen
- 16. Anzeige aller aktuell definierten Variablen
- 17. Deklarieren von globalen Variablen in Objective-C
- 18. Erfassen von Nashorns globalen Variablen
- 19. Verwechslung mit Klassen und globalen Variablen
- 20. Antworten auf meine globalen Variablen?
- 21. Ausgabe mit einer globalen Variablen
- 22. Inner-Klasse mit globalen Variablen
- 23. Vorlage der konstanten globalen Variablen
- 24. Verwenden einer globalen Variablen in Javascript
- 25. Gibt es einen Unterschied zwischen der Deklaration einer Variablen in den Bereichen LOC, VAR und VARIABLES?
- 26. Häufigkeit von globalen Variablen in Python?
- 27. Vermeiden von globalen Variablen in Genie
- 28. Alle definierten MSBuild-Variablen auflisten - Entspricht
- 29. TypeScript - Unterschied zwischen privaten und geschützten Variablen
- 30. Gibt es Unterschiede zwischen Senden und Senden in SimGrid?
Wirklich eine gute Antwort! – none