Perl unterstützt zwei Formen von String-Literalen — doppelte (“) und einfache (’) Anführungszeichen. Innerhalb von Strings in doppelten Anführungszeichen findet eine Interpolation statt: Variablen und spezielle Symbole wie , \t werden durch ihre Werte ersetzt. In einfachen Anführungszeichen gibt es keine Interpolation — der Inhalt wird wörtlich interpretiert.
Beispiel:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # Die Interpolation von Ausdrücken ist möglich durch geschweifte Klammern: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} innerhalb des Strings mit Interpolation – das ist eine sichere Methode, um das Ergebnis eines Ausdrucks in den String einzufügen.In welchen Fällen werden Variablen innerhalb eines Strings in doppelten Anführungszeichen nicht interpoliert?
Antwort: Wenn die Variable escapiert ist (\$var), innerhalb einfacher Anführungszeichen ist, oder wenn die Syntax mit geschweiften Klammern verwendet wird, aber nicht wie vorgesehen, oder der Variablenname nicht durch Klammern begrenzt ist und eine "Verkettung" des Variablennamens mit Buchstaben geschieht.
my $world = 'earth'; print "Hello, $worlds! "; # FEHLER: Variable $worlds existiert nicht, sondern ist $world + Buchstabe s
Geschichte
In einem großen Projekt wurden Strings mit Variablen für das Logging verwendet:
my $file = '/tmp/data'; print LOG 'File: $file
';
Man erwartete den Pfad zur Datei zu sehen, aber im Log landete der wörtliche Text `$file`, da einfache Anführungszeichen verwendet wurden. Das Problem wurde nach dem Start in der Produktion bemerkt.
Geschichte
Ein Entwickler setzte eine Variable innerhalb eines Strings ohne geschweifte Klammern ein:
my $user = "bob"; print "User: $user21
";
Man erwartete, dass `bob21` ausgegeben wird, aber der Interpreter begann, die Variable `$user21` zu suchen (die nicht existierte). Dadurch entstand ein leerer Wert in den Berichten.
Geschichte
Zur Anzeige des Ergebnisses eines Ausdrucks innerhalb eines Strings wurde folgender Code verwendet:
my $a = 3; print "Sum: $a+5
"; # Erwartet: 'Sum: 8', erhalten: 'Sum: 3+5'
Tatsächlich betrachtet die Interpolation nur Variablen, Ausdrücke werden wörtlich eingegeben. Man muss durch @{[ ... ]} arbeiten.