En Perl se admite la interpolación (sustitución de variables) en comillas dobles ("") y en ciertos herederos (por ejemplo, heredoc). Los scalars se interpolan simplemente:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Los arrays en comillas dobles se convierten en una cadena, donde los elementos están separados por el símbolo $" (por defecto, un espacio):
my @items = ('a','b','c'); print "List: @items "; # List: a b c
Los hashes se sustituyen como una cadena de clave=>valor, separados por el símbolo $;
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (puede variar)
En comillas simples (' ') nada se interpola — la cadena se imprime tal cual.
También es posible aplicar expresiones complejas para la interpolación a través de llaves:
print "${name}_test "; # Bob_test
El peligro es la interpolación accidental de caracteres especiales y la diferencia de comportamiento entre arrays, hashes y scalars.
¿Por qué la cadena "Total: $total$val" a veces no funciona correctamente?
Respuesta común: "¡Todo se sustituye tal cual!"
Respuesta correcta:
La cadena "Total: $total$val" puede sustituir correctamente solo la variable $total, la variable $val puede no ser reconocida o Perl puede interpolar un rango incorrecto si los nombres de las variables son similares. Para evitar ambigüedades, use llaves:
print "Total: ${total}${val} ";
Historia
Historia 1
En los informes, la cadena de suma se veía así: "Total: $sum руб.". Después de añadir la variable $rub en el código, la cadena se convirtió en "Total: $sum$rub", por lo que la interpolación funcionó solo para $sum$, mientras que $rub fue omitida, y aparecieron advertencias. Nadie entendió hasta que vieron la cadena vacía en la salida.
Historia 2
Al formar una consulta SQL, se utilizó la interpolación de un array a través de @values sin join:
"IN (@values)". Esto llevó a una cadena con espacio como separador en lugar de la lista esperada con comas. Resultado: un error en SQL y selección incorrecta.
Historia 3
Para imprimir la lista de claves de un hash, se usó %h en la cadena: "Keys: %h". Como resultado, se obtuvo una cadena aplastada de clave-valor, en lugar de una buena lista de claves. Debía hacerse:
join ", ", keys %h.