Las cadenas con comillas dobles permiten la interpolación de variables. Esto quiere decir que si en la cadena escribes el nombre de una variable escalar, se sustituirá por su valor.
$a = 1; print "$a"; # imprime un 1 print '$a'; # imprime $a
El nombre de la variable es el identificador mas largo que sigue al $
.
Esto puede ser un problema si lo que quieres es imprimir el valor de la variable
seguido de letras. La solución es envolver el identificador de la variable entre
llaves. Vea el siguiente ejemplo:
pp2@nereida:~/doc/2005_2006$ perl -wde 0 main::(-e:1): 0 DB<1> $que = "chuleta"; $n = 3 DB<2> print "Antonio comió $n $ques.\n" Use of uninitialized value in concatenation (.) or string at (eval 6)\ [/usr/share/perl/5.8/perl5db.pl:628] line 2. at (eval 6)[/usr/share/perl/5.8/perl5db.pl:628] line 2 eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; print "Antonio comió $n $ques.\\n"; ;' called at /usr/share/perl/5.8/perl5db.pl line 628 DB::eval called at /usr/share/perl/5.8/perl5db.pl line 3410 DB::DB called at -e line 1 Antonio comió 3 .El resultado es un mensaje de advertencia del depurador: La variable
$ques
no esta incializada. La salida es:
Antonio comió 3 .
Una variable no inicializada contiene el valor especial undef .
Cuando el valor undef
se evalúa en un contexto de cadena se evalúa
como una cadena vacía.
Mediante el uso de llaves logramos la respuesta correcta:
DB<3> print "Antonio comió $n ${que}s.\n" Antonio comió 3 chuletas.Otra solución es usar el operador de concatenación (denotado mediante un punto
"."
):
DB<4> print "Antonio comió $n $que"."s.\n" Antonio comió 3 chuletas.
Casiano Rodríguez León