Hallo Thomas,
Der entscheidende Punkt ist (wie schon von anderen erklärt), dass my sich auf den Block oder eine Datei bezieht, nicht auf die Package-Angabe.
Das dürfte wohl einfach historische Gründe haben, denn das ist weder intuitiv noch irgendwie anderweitig sinnvoll.
Die Lösung ist einfach, jedes Package in einer eigenen Datei abzulegen. In der Regel organisiert man Perl-Programme so in Module.
Das Package foo::bar sollte also in der datei foo/bar.pm liegen.
Außerdem sollte die letzte Anweisung des Moduls 1; sein. Das liegt daran, da use foo::bar; fehl schlägt, wenn das Modul einen Wert zurück gibt, der einem "false" entspricht. Nur um diesen nächsten Stolperstein schonmal vorweg zu nehmen.
Perl hat in vielen Stellen historischen Ballast, aber in den nächsten 20 Jahren wird ja vielleicht Perl 6 fertig ;-)
Bedeutet "Closures oder auch Referenzen", dass Closures und Referenzen
Synonyme sind oder sind Referenzen wieder eine andere Methode um obiges zu erkennen?
Das sind zwei ganz unterschiedliche Dinge. Referenzen gab es in dem Beispiel gar nicht.
Closures sind Funktionen, die Zugriff auf den Kontext haben, in dem sie deklariert wurden:
sub counter {
my $count = shift;
return sub {
return $count++;
};
}
my $c1 = counter(5);
my $c2 = counter(2);
my $c3 = c2;
print $c1->(), $c2->(), $c1->(), $c3->();
Ergebnis: 5263
sub {return $count++}; ist eine anonyme Funktion (sie hat keinen Namen) und eine Closure (sie hat Zugriff auf $count, auch nachdem die Funktion counter schon abgelaufen ist. Wohlgemerkt jeweils auf eine andere "Instanz" von $count.)
$c1, $c2 und $c3 sind Referenzen auf die anonyme Funktion. Man sieht, dass sie die Funktion nicht enthalten, sonst würde bei $c2 = c3 die Funktion kopiert. $c3->() ruft aber offensichtlich die selbe Funktion auf. Kopiert wurde an der Stelle also nur ein Verweis auf die gleiche Funktion.
Referenzen sieht man aber noch deutlicher bei Referenzen auf andere Variablen. Das war auch, was ich im vorherigen Posting meinte:
my $a = 1;
my $b = \$a; # referenz auf $a
$$b = 2;
print $a;
Ergebnis: 2
Es gibt außer Referenzen auf Variablen und Funktionen noch solche auf Arrays und Hashes. (my $a = [1, 2, 3]; my $b = {a => 1, b => 2})
Gerade das Konzept der Referenzen ist recht elementar. (Für Perl wie Programmierung überhaupt) Es empfiehlt sich, sich das genauer anzusehen (Buch oder so, die Perl-Dokumentation ist zwar ausführlich aber es fehlt der für Einsteiger notwendige rote Faden)
Grüße
Daniel