Perl admite dos formas de literales de cadena: comillas dobles (“) y comillas simples (’). Dentro de las cadenas con comillas dobles, ocurre la interpolación: las variables y caracteres especiales como , \t se reemplazan por sus valores. En las comillas simples, no hay interpolación: el contenido se toma literalmente.
Ejemplo:
my $name = "Alex"; print "Hola, $name! "; # Hola, Alex! print 'Hola, $name! '; # Hola, $name! # La interpolación de expresiones es posible a través de llaves: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} dentro de la cadena con interpolación: es una forma segura de insertar el resultado de una expresión en la cadena.¿En qué casos las variables dentro de una cadena en comillas dobles no se interpolarán?
Respuesta: Cuando la variable está escapada (\$var), dentro de comillas simples, o si se utiliza la sintaxis con llaves, pero no de manera apropiada, o si el nombre de la variable no está delimitado por llaves y se produce una "concatenación" del nombre de la variable con letras.
my $world = 'tierra'; print "Hola, $worlds! "; # ERROR: La variable $worlds no existe, no $world + letra s
Historia
En un gran proyecto, para el registro se usaron cadenas con variables:
my $file = '/tmp/data'; print LOG 'File: $file
';
Se esperaba ver la ruta del archivo, pero en el log se almacenaba el texto literal `$file`, ya que se usaban comillas simples. El problema se notó después de ponerlo en producción.
Historia
Un desarrollador insertó una variable dentro de una cadena sin llaves:
my $user = "bob"; print "Usuario: $user21
";
Se esperaba que se mostrara `bob21`, pero el intérprete comenzó a buscar la variable `$user21` (que no existía). Esto causó un valor vacío en los informes.
Historia
Para mostrar el resultado de una expresión dentro de una cadena se utilizó el siguiente código:
my $a = 3; print "Suma: $a+5
"; # Se esperaba: 'Suma: 8', se recibió: 'Suma: 3+5'
De hecho, la interpolación solo considera variables, las expresiones se insertan literalmente. Se debe trabajar a través de @{[ ... ]}.