Perl-Programmierung: Spezialvariablen
Aus Wikibooks
[Bearbeiten] Die Default-Variable $_ / @_
Neben den ganz normalen Variablen ( wie sie auch jede andere Programmiersprache kennt ) besitzt Perl eine ganz Besondere: $_
Diese Variable wird immer dann genutzt, wenn der/die ProgrammiererIn das Ergebnis einer Funktion/Berechnung/etc. in keiner eigenen Variablen speichern möchte oder kann, wie es bei den Postfix-Schleifen der Fall ist. Analog steht im Array-Kontext das Spezial-Array @_ zur Verfügung.
sub addition { my ($a); { local $_; $a += $_ for @_; } $_=$a unless defined wantarray; return $a } $a = addition(1,1); # $a = 2 addition(1,1); # $_ = 2
Weiterhin benutzen einige in perl eingebaute Funktionen diese Variable, wenn sonst keine Argumente vorhanden sind. Ein gutes Beispiel dafür ist die print Funktion:
$a = addition(1,1); print $a;
ist das gleiche wie :
addition(1,1); print;
-- DENKPAUSE --
OK. Das kleine Beispiel ist noch klein ( und unnütz- man hätte auch "print addition(1,1)" schreiben können ). Richtig Spaß macht die Variable $_ aber erst, wenn man damit längere Quelltexte abkürzen kann.
z.B.:
while (<STDIN>) { s/BöserText/GuterText/; s/Lisp/Perl/; # :-) print; }
- Zeilenweise einlesen von STDIN ( meistens Tastatur ) und speichern der gelesenen Zeile in $_
- Ein Suchen-Ersetzten-RegEx : Ersetzt 'BöserText' durch 'GuterText' IN DER VARIABLEN $_;
- Ein weiterer Suchen-Ersetzen-Regex. Merke : Perl nimmt $_ wenn keine andere Variable gesetzt ist
- Ausgabe von $_ ( welches nun nurnoch "GutenText" und kein "Lisp" mehr enthalten sollte )
- Hole die nächste Zeile
Das gleiche Programm könnte man auch so schreiben :
while ( $line = <STDIN> ) { $line =~ s/BöserText/GuterText/; $line =~ s/Lisp/Perl/; # :-| print $line; }
Über das Für und Wider dieser Spezialvariable kann man sich sicher streiten, unbestreitbar ist dessen Nutzung in diversen Beispielen im Internet. Mit etwas Erfahrung und dem Wissen um die Eigenschaften dieser Variable kann durch sie die Lesbarkeit des Quellcodes verbessert werden.
Gerade zu Begin der eigenen Perl-Karriere kann die Nutzung von $_ eventuell hinderlich sein. Auch in größeren Projekten kann man sich durch übermäßige Nutzung dieses Features leider ab und an in die eigenen Füße schießen. Trotz aller dieser Widrigkeiten kann man durch $_ kleine Scripte noch kleiner machen und dadurch die "Produktionsgeschwindigkeit" erhöhen.
Auf jeden Fall muss man beim Programmieren beachten, dass $_ global ist. Wenn $_ innerhalb einer Funktion geändert wird ändert sie auch den Wert außerhalb der Funktion. Um sich davor zu schützen kann man die Variable für den Bereich in dem sie geändert wird lokal machen.
Eigene Funktionen ändern $_ nicht automatisch, wenn bei ihrem Aufruf kein lvalue angegeben ist, der den Wert aufnimmt. Perl kennt aber die eingebaute Funktion wantarray die beim Thema Kontext von Funktionen eine Rolle spielt. Ist ihr Rückgabewert undef dann wurde die Funktion im sogenannten void-Kontext aufgerufen und die Programmiererin könnte $_ explizit setzen um das Verhalten der Funktion mehr perlish zu gestalten.
[Bearbeiten] ARGV
Zur Übergabe von Kommandozeilenparametern dient das Spezialarray @ARGV. Es kann, was das Auslesen und (Über-)Beschreiben seiner Werte betrifft genau wie ein handelsübliches Array behandelt werden.

