Moin!
Mit my deklarierte Variablen lassen sich von anderen Packages (eg. main::) nicht
ansprechen, da sie im Stack (der "lexikalische Scope") des Moduls gespeichert werden.
our ist nach der Dokumentation eine Art "Durchschnitt" zwischen globalen Variablen
(diese werden in der Symbol-Table des main:: Moduls referenziert) und den lokalen
Variablen die eben im aktuellen Scope definiert sind. Durchschnitt deshalb, da sie
- und damit komme ich auf die eigentliche Antwort der Frage - eben trotz lokalem
Charakter (Modul-Stack) von anderen Modulen ausgelesen werden können.
Naja, das stimmt nicht ganz. Die our-Variable wird im Symbol-Table des packages gespeichert, in dem sie deklariert wird, nicht unbedingt main::.
Im Prinzip ist 'our' nur ein Shortcut, um von einem anderen package aus, das sich aber im selben lexikalischen Scope befindet (i.e. mehrere Module in derselben Datei), ohne volle Qualifizierung (also volle $package::var-Angabe) auf die Variable zuzugreifen.
Schoen und gut, aber die entscheidende Frage ist doch, welchen Sinn hat das? Mir scheint, das hilft nur in eingen Faellen, mit einem schlechten Design doch noch irgendwie zurecht zu kommen.
use strict;
print $test::test."\n";
while ( my ($n,$v) = each %{test::} ) {
print "$n=$v\n";
}package test;
use strict;
my $test = '15';
BEGIN {$test = 'test';}1;
die Variable $test ist im Modul test über my deklariert. Erwartungsgemäss wird die
Variable über main::print($test::test) nicht ausgegeben,
Jedenfalls nicht das $test, das Du mit my deklarierst.
aber etwas erstaunt mich: Die Variable $test::test wird trotz lokaler Definition in der Symbol-Tabelle referenziert.
Referenziert? Meinst Du, dass ihre Existenz in der Schleife angezeigt wird? Das duerfte daran liegen, dass Du sie vorher mit dem print-Kommando auto-vivified hast.
Das spricht gegen mein "Weltbild", da ich davon überzeugt war, dass
Variablen über 'my' im Stack (Perl ist stackorientiert, nicht zu verwechseln mit dem
Stack-Segment bei 3GL Languages) gespeichert werden und nicht in der Symbol-Tabelle
referenziert sind, da dort referenzierte Variablen IMHO eben den "Modul-Variablen" über
use vars qw/.../ entsprechen.? - Warum werden in der Symbol-Tabelle lokale Variablen
gespeichert? - Die sollte IMHO Modul-Charakter haben (also Modul-Variablen enthalten)...
Nun ja, es gibt hier zwei $test's im package test::. Eine Modul-Variable, die nur existiert, weil Du mit print darauf zugegriffen hast (Auto-Vivification), und dann die my-Variable, die aufgrund ihrer Position auch im ganzen package test:: sichtbar ist, aber nicht von aussen (main::). Das einzige, was mich wundert, ist dass im BEGIN auf die my-Variable zugegriffen wird, nicht auf die Modul-Variable. Man sieht das, wenn man den BEGIN-Block zu
BEGIN {$test::test = 'test';}
abaendert. Dann wird im print-Statement 'test' ausgegeben, da die Variable dann schon eher exisitert und nicht mehr auto-vivified wird. Aber muesste das BEGIN nicht eher als das my-Statement ausgefuehrt werden und daher auf die Modul-Variable $test::test zugreifen (und dabei abgebrochen werden, weil es gegen use strict verstoesst)?
So long
Es gibt Diebe, die nicht bestraft werden und einem doch das Kostbarste stehlen: die Zeit.
-- Napoleon Bonaparte