ProgrammierungPerl-Programmierer/Backend-Entwickler

Wie funktionieren Kontexte in Perl (skalar, list und void)? Geben Sie Beispiele an, bei denen das Verhalten des Codes vom gewählten Kontext abhängt.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In Perl gibt es Kontexte, die das Verhalten von Operatoren und Funktionen beeinflussen:

  • Skalar (scalar) — der Ausdruck wird als ein Wert berechnet.
  • List (list) — der Ausdruck wird als Liste von Werten berechnet.
  • Void — das Ergebnis wird nicht verwendet.

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

Fangfrage

Welches Ergebnis erhält die Funktion keys %hash im 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')

Beispiele für reale Fehler aufgrund besonderer Kenntnisse des Themas


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 gespeichert

Das erschwerte die Fehlersuche — die Funktion arbeitete, aber die Datei wurde nirgendwo gespeichert und Fehler wurden nicht abgefangen.