Perl supporta due forme di letterali stringa — doppie (“) e singole (’). All'interno delle stringhe tra virgolette doppie avviene l'interpolazione: le variabili e i caratteri speciali come , \t vengono sostituiti con i loro valori. Nelle virgolette singole non c'è interpolazione — il contenuto viene considerato letterale.
Esempio:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # L'interpolazione delle espressioni è possibile tramite le parentesi graffe: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} all'interno della stringa con interpolazione – è un modo sicuro per inserire il risultato di un'espressione nella stringa.In quali casi le variabili all'interno della stringa tra virgolette doppie non verranno interpolate?
Risposta: Quando la variabile è sfuggita (\$var), all'interno di virgolette singole, oppure se viene utilizzata la sintassi con le parentesi graffe, ma non per scopo, oppure il nome della variabile non è delimitato da parentesi e avviene una "giunzione" del nome con lettere.
my $world = 'earth'; print "Hello, $worlds! "; # ERRORE: La variabile $worlds non esiste, ma non $world + lettera s
Storia
In un grande progetto si utilizzavano stringhe con variabili per il logging:
my $file = '/tmp/data'; print LOG 'File: $file
';
Si prevedeva di vedere il percorso del file, ma nel log andava il testo letterale `$file`, poiché venivano utilizzate le virgolette singole. Il problema è emerso dopo il lancio in produzione.
Storia
Uno sviluppatore ha inserito una variabile all'interno della stringa senza le parentesi graffe:
my $user = "bob"; print "User: $user21
";
Ci si aspettava che fosse visualizzato `bob21`, ma l'interprete ha iniziato a cercare la variabile `$user21` (che non esisteva). Questo ha portato a un valore vuoto nei report.
Storia
Per visualizzare il risultato dell'espressione all'interno della stringa è stato utilizzato il seguente codice:
my $a = 3; print "Sum: $a+5
"; # Ci si aspettava: 'Sum: 8', si è ottenuto: 'Sum: 3+5'
Infatti, l'interpolazione considera solo le variabili, le espressioni vengono sostituite letteralmente. È necessario lavorare con @{[ ... ]}.