Perl enthält viele magische Variablen (auch "spezielle" oder "systemische"), die die Ausführung des Programms beeinflussen:
$_ — Standardvariable für viele Operatoren (foreach, map, grep, while <> usw.).@_ — Array der Eingabeargumente innerhalb von Unterprogrammen.%SIG — Hash mit Signalhandlern des Betriebssystems.my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # das originale Array wird geändert! } sub show_args { print "Erster: ", $_[0], "\n"; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Ctrl-C erfasst\n"; exit; };
Vorsicht: viele magische Variablen werden implizit geändert; falscher Umgang kann den globalen Zustand des Programms beeinflussen.
Kann die globale Variable $_ sicher in mehreren geschachtelten Schleifen oder Unterprogrammen verwendet werden?
Antwort: Nein, da geschachtelte Schleifen oder Unterprogramme oft $_ überschreiben, was zum Verlust des Wertes im äußeren Kontext führt. Es wird empfohlen, explizite Variablen zu verwenden:
foreach my $x (@a) { foreach my $y (@b) { ... } }
Geschichte
In einem Skript zur Verarbeitung großer Logs wurde die Schleife while(<FH>) {...} verwendet. Innerhalb der Schleife wurde eine Funktion aufgerufen, die ihrerseits map ohne eigene Variablendeklaration aufrief, was $_ in der äußeren Schleife beschädigte und zu übersprungenen Zeilen führte.
Geschichte
Bei der Verarbeitung von Signalen über %SIG hat der Entwickler den Handler __DIE__ überschrieben, jedoch nicht berücksichtigt, dass dies das Verhalten des gesamten Prozesses, einschließlich externer Module, beeinflusst und zu einem unkontrollierten Abbruch bei Fehlern im fremden Code führte.
Geschichte
Die Optimierung der Übergabe von Argumenten durch Verweis auf das Array (@_) innerhalb eines Unterprogramms und der Versuch, dessen Werte direkt ohne explizite Kopie zu ändern, führten zu unerwarteten Änderungen von Variablen im äußeren Code.