ProgrammierungPerl-Entwickler

Erzählen Sie, wie in Perl die Interpolation von Arrays, Hashes und Skalaren in unterschiedlichen Typen von Strings funktioniert und welche Gefahren mit diesem Mechanismus verbunden sind.

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

Antwort

In Perl wird Interpolation (Variablenersetzung) in doppelten Anführungszeichen ("") und in bestimmten Vorlagen (z. B. heredoc) unterstützt. Skalare werden einfach interpoliert:

my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!

Arrays in doppelten Anführungszeichen werden nach der Ersetzung in eine Zeichenkette umgewandelt, in der die Elemente durch das Zeichen $" (standardmäßig ein Leerzeichen) getrennt sind:

my @items = ('a','b','c'); print "List: @items "; # List: a b c

Hashes werden als Zeichenkette von Schlüssel=>Wert, getrennt durch das Zeichen $;, eingesetzt:

my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (kann abweichen)

In einfachen Anführungszeichen (' ') wird nichts interpoliert — der String wird wörtlich ausgegeben.

Es ist auch möglich, komplexe Ausdrücke zur Interpolation mit geschweiften Klammern zu verwenden:

print "${name}_test "; # Bob_test

Die Gefahr besteht in zufälliger Interpolation von Sonderzeichen und den unterschiedlichen Verhaltensweisen von Arrays, Hashes und Skalaren.


Fangfrage

Warum funktioniert der String "Total: $total$val" manchmal nicht richtig?

Häufige Antwort: "Alles wird so eingesetzt, wie es ist!"

Richtige Antwort:

Der String "Total: $total$val" kann nur die Variable $total korrekt einsetzen, die Variable $val könnte nicht erkannt werden oder Perl könnte einen falschen Bereich interpolieren, wenn die Variablennamen ähnlich sind. Um Mehrdeutigkeiten zu vermeiden, verwenden Sie geschweifte Klammern:

print "Total: ${total}${val} ";

Geschichte


Geschichte 1

In den Berichten sah der Summenstring so aus: "Total: $sum Rubel." Nach der Hinzufügung der Variable $rub im Code wurde der String zu "Total: $sum$rub", was dazu führte, dass die Interpolation nur für $sum$ funktionierte, während $rub übersprungen wurde, und es gab Warnungen. Niemand verstand es, bis sie den leeren String in der Ausgabe sahen.


Geschichte 2

Bei der Erstellung einer SQL-Abfrage wurde die Interpolation des Arrays über @values ohne join verwendet: "IN (@values)". Dies führte zu einem String mit einem Leerzeichen als Trennzeichen anstelle der erwarteten Liste mit Kommas. Ergebnis — ein Fehler in SQL und eine inkorrekte Auswahl.


Geschichte 3

Zur Ausgabe der Schlüssel eines Hashes wurde %h in den String verwendet: "Keys: %h". Dabei entstand ein zusammengefügter Schlüssel-Wert-String anstelle einer guten Liste von Schlüsseln. Man hätte tun sollen: join ", ", keys %h.