Perl-Programmierung: Spezialvariablen


Das Persönliche Fürwort $_

Bearbeiten

Eine Eigenheit von Perl ist die Vielzahl von vordefinierten Spezialvariablen. Die perlischte Spezialvariable ist $_.

Im Deutschen gibt es die Personalpronomen er, sie und es. Analog gibt es in Perl die Default-Variable $_. Man kann Werte an $_ zuweisen um bekanntzugeben wovon gerade die Rede ist. Andererseite weisen diverse Sprachkonstrukte automatisch Werte an $_ zu. Die meisten stringverarbeitenden Funktionen benutzen $_ als Standardeingabe.

In einer Schleife über die Werte Himbeereis, Regina und hitzefrei ist klar wovon jeweils die Rede ist, also kann man $_ verwenden.

foreach ('Himbeereis', 'Regina', 'hitzefrei' ) {
    print "Ich mag $_.\n";
}

Gibt aus:

 Ich mag Himbeereis.
 Ich mag Regina.
 Ich mag hitzefrei.

Bei der Stringverarbeitung kann man die implizite Variable $_ verwenden um prägnant zu programmieren.

while (<STDIN>) {                # Zeilenweise einlesen von der Standardeingabe STDIN. 
                                 # Die gelesene Zeile wird automatisch in $_ gespeichert.
    s/BöserText/GuterText/;       # Ein Suchen-Ersetzen-RegEx : Ersetzt 'BöserText' durch 'GuterText' in der Variablen $_;
    s/PHP/Perl/;                 # Ein weiterer Suchen-Ersetzen-Regex. Merke : Perl nimmt $_ wenn keine andere Variable gesetzt ist 
    print;                       # Ausgabe von $_, welches nun nur noch "GutenText" und kein "PHP" mehr enthalten sollte.
}                                # Hole die nächste Zeile

Das gleiche Programm könnte man auch so schreiben :

while ( my $line = <STDIN> ) {
    $line =~ s/BöserText/GuterText/;
    $line =~ s/PHP/Perl/; # :-|
    print $line;
}

Anstatt der impliziten Variable $_ wurde hier explizit die Variable $line benutzt.

Ü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.

sub addition {
    my ($a); 

    { local $_;  
      $a += $_ for @_; # @_ enthält die Funktionsparameter
    }
    $_ = $a unless defined wantarray;

    return $a
}

$val = addition(1,1);  # $val = 2
addition(1,1);       # $_ = 2

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.