In Perl gibt es Kontexte, die das Verhalten von Operatoren und Funktionen beeinflussen:
scalar) — der Ausdruck wird als ein Wert berechnet.list) — der Ausdruck wird als Liste von Werten berechnet.Funktionen und Operatoren können je nach Kontext unterschiedliche Ergebnisse zurückgeben.
Beispiele:
my @arr = (1, 2, 3); my $count = @arr; # skalarer Kontext: $count = 3 my @copy = @arr; # Listen-Kontext: das gesamte Array wird kopiert my $line = <STDIN>; # liest eine Zeile (skalar) my @lines = <STDIN>; # liest alle Zeilen (listenweise)
Den Kontext kann man ausdrücklich durch die Funktion scalar() festlegen:
my $last_idx = scalar @arr; # erzwingt den skalarer Kontext
Welches Ergebnis erhält die Funktion
keys %hashim skalarer Kontext?
Antwort: Gibt die Anzahl der Elemente im Hash zurück, und nicht eine Liste der Schlüssel wie im Listen-Kontext.
my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')
Geschichte
In einem Projekt wurde die Anzahl der Elemente im Array gezählt:
my @items = get_items(); my $cnt = @items;Später beschloss jemand,
$cnt = get_items();zuzuweisen, ohne zu verstehen, dass die Funktion eine Liste zurückgibt — jetzt gab es immer nur einen (erstes) Rückgabewert und nicht die Anzahl der Elemente.
Geschichte
Beim Lesen von Zeilen aus einer Datei:
my $lines = <FILE>;In der Erwartung, die gesamte Datei zu erhalten, erhielt man nur die erste Zeile — man hatte nicht bedacht, dass im skalarer Kontext nur eine einzelne Zeile zurückgegeben wird.
Geschichte
Der Entwickler rief eine Funktion im void-Kontext auf, ohne den erhaltenen Wert zu verwenden:
open_my_file(); # Funktion gibt einen Deskriptor zurück, aber er wurde nicht gespeichertDas erschwerte die Fehlersuche — die Funktion arbeitete, aber die Datei wurde nirgendwo gespeichert und Fehler wurden nicht abgefangen.