Perl ondersteunt twee vormen van stringliteral — dubbele (“) en enkele (’) aanhalingstekens. Binnen strings met dubbele aanhalingstekens vindt interpolatie plaats: variabelen en speciale symbolen zoals , \t worden vervangen door hun waarden. In enkele aanhalingstekens is er geen interpolatie — de inhoud wordt letterlijk genomen.
Voorbeeld:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # Interpolatie van een uitdrukking is mogelijk via accolades: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} voor complexe uitdrukkingen binnen een string met interpolatie – dit is een veilige manier om het resultaat van een uitdrukking in de string in te voegen.In welke gevallen zullen variabelen binnen een string met dubbele aanhalingstekens niet geïnterpoleerd worden?
Antwoord: Wanneer de variabele is geescaped (\$var), binnen enkele aanhalingstekens, of als de syntaxis met accolades wordt gebruikt, maar niet correct, of als de variabele naam niet door accolades wordt begrensd en er "samensmelting" van de variabele naam met letters plaatsvindt.
my $world = 'earth'; print "Hello, $worlds! "; # FOUT: Er is geen variabele $worlds, alleen $world + de letter s
Verhaal
In een groot project werden strings met variabelen gebruikt voor logging:
my $file = '/tmp/data'; print LOG 'File: $file
';
Men verwachtte het pad naar het bestand te zien, maar in de log werd de letterlijke tekst `$file` weggeschreven, omdat er enkele aanhalingstekens werden gebruikt. Het probleem werd ontdekt na de lancering in productie.
Verhaal
Een ontwikkelaar voegde een variabele in de string in zonder accolades:
my $user = "bob"; print "User: $user21
";
Men verwachtte dat `bob21` werd weergegeven, maar de interpreter begon naar de variabele `$user21` te zoeken (die er niet was). Dit veroorzaakte een lege waarde in de rapporten.
Verhaal
Voor het weergeven van het resultaat van een uitdrukking binnen een string werd deze code gebruikt:
my $a = 3; print "Sum: $a+5
"; # Verwacht: 'Sum: 8', gekregen: 'Sum: 3+5'
Inderdaad, interpolatie beschouwt alleen variabelen, uitdrukkingen worden letterlijk ingevoegd. Men moet werken via @{[ ... ]}.