Hallo Thomas,
Die Begriffe "global", "lexikalisch", "lokal" wurden ja nicht für Perl erfunden. Daher kann man diese Begriffe zur Beschreibung auch in anderer Kombination und anderem Kontext verwenden, als das die Perl-Dokumentation tut. Ich für meinen Teil kenne die Perl-Nomenklatur gar nicht so genau.
Lexikalisch heißt wohl erstmal, dass sich der Gültigkeitsbereich am (syntaktischen) aufbau des Programms orientiert. Solche lexikalischen Gültigkeitsbereiche sind die Datei oder der Block. (Funktionen sind ein Spezialfall von Block. In Perl kann man mit dieser Block-Regel so witzige Sachen machen wie:
{
my $counter = 1;
sub count {
return $count++;
}
}
count hat damit einen nach außen nicht sichtbaren Zustand.
packages bilden keine solchen lexikalischen Gültigkeitsbereiche. Das ist meines erachtens konzeptionell unschön. packages hätte man vielleicht besser auch als eigene lexikalische Strukturen mit Block eingeführt und nicht als Anweisungen, die den aktuellen Namensraum ändern.
Global und lokal sind nun Begriffe, die man eigentlich immer nur in Bezug auf einen Kontext klar verstehen kann. Von daher kann eine Variable, die bezüglich einer Funktion global ist, bezüglich einer Datei eben auch lokal sein.
Man kann auch von im Programm lokalen Variablen sprechen (hast Du ja irgendwo gefragt), wenn man irgend einen Kontext hat, der größer ist als das Programm. Wenn man irgendwelche Technologien für verteilte Programmierung o.ä. verwendet, kann das durchaus vorkommen.
Zu Deiner Erkenntnis, Perl sei keine besonders klar konzeptionierte Sprache:
Es ist nicht das Ziel von Perl, eine einfache, übersichtliche Sprache zu sein. Das Konzept war immer, viele Möglichkeiten und Stile zuzulassen. Das wird wohl auch in Zukunft so bleiben, wenn man sich Entwürfe für die Weiterentwicklung ansieht, obwohl da die Sprache neu entworfen wird.
Dieser Ansatz führt dazu, dass man mit Perl sehr produktiv arbeiten kann.
Für mich (und sicher für viele andere) ist Perl eine Sprache um kleinere Aufgaben sehr schnell zu erledigen, um Abläufe zu automatisieren und verschiedene Teile schnell zusammenzubasteln, weniger eine Sprache um größere, langfristige Projekte zu entwickeln.
Für Perl muss man zudem einfach einen gewissen Stil entwickeln, um sauber zu programmieren. Wenn man jede historisch entstandene Tücke der Semantik (und das mit Packages zähle ich dazu) verwendet, führt das schnell zur Verwirrung.
Grüße
Daniel