2012-08-02 66 views
6

¿Hay una forma diferente de concatenar variables en perl? Accidentalmente escribió la siguiente línea de código:Cómo concatenar variables en Perl?

print "$linenumber is: \n" . $linenumber; 

Y que resultó en una salida como:

22 is: 
22 

que estaba esperando:

$linenumber is: 
22 

Entonces me preguntó. Debe interpretar el $linenumber en las comillas dobles como referencia a la variable. (¡qué bueno!)

Me pregunto: ¿Cuáles son las advertencias sobre el uso de este método y podría alguien explicar cómo funciona?

+0

Técnicamente no es necesario para concatenar las variables, como 'print' puede tomar más de un argumento. 'print '$ linenumber es: \ n', $ linenumber;' funciona también. (Aunque debe tener en cuenta la variable incorporada '$,' (consulte 'man perlvar'). – chepner

+1

' '$ linenumber is: \ n'' no va a hacer lo que quiera :-) –

Respuesta

12

La interpolación de variables se produce cuando utiliza comillas dobles. Entonces, los personajes especiales necesitan ser escapados. En este caso, tiene que escapar del $:

print "\$linenumber is: \n" . $linenumber; 

Se puede reescribir como:

print "\$linenumber is: \n$linenumber"; 

Para evitar la interpolación de cadenas, utilice comillas simples:

print '$linenumber is: ' . "\n$linenumber"; # No need to escape `$` 
+0

¡Oh! No se dio cuenta de eso. Lo he actualizado Gracias. –

+0

Al interpolar variables y el límite de nombre de la variable no está claro (por ejemplo, "mi $ page = 12; print" $ pagep. "'), Debe adjuntar el nombre de la variable dentro de llaves '$ {...}'. Es decir 'print" $ {page} p. "' – Aurimas

1

Al formular esta respuesta, encontré this webpage que explica la siguiente información:

################################################### 
#Note that when you have double quoted strings, you don't always need to concatenate. Observe this sample: 

#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print 'I like to eat ' . $a . $b; 

#This prints out: 
# I like to eat Big Macs 

################################################### 

#If we had used double quotes, we could have accomplished the same thing like this: 

#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print "I like to eat $a $b"; 

#Printing this: 
# I like to eat Big Macs 
#without having to use the concatenating operator (.). 

################################################### 

#Remember that single quotes do not interpret, so had you tried that method with single quotes, like this: 


#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print 'I like to eat $a $b'; 
#Your result would have been: 
# I like to eat $a $b 
#Which don't taste anywhere near as good. 

pensé que esto sería de gran ayuda a la comunidad, así que estoy pidiendo esto y responder a mi propia pregunta. ¡Otras respuestas útiles son más que bienvenidas!

1

puede hacer una barra diagonal inversa en el $ para imprimirlo literalmente.

print "\$linenumber is: \n" . $linenumber; 

que imprime lo que esperaba. También puede usar comillas simples si no desea que Perl interpole los nombres de las variables, pero entonces el "\n" se interpolará literalmente.

+0

This es un buen punto Algo me olvidé de mencionar eso. Pensé que no era exactamente lo que era mi pregunta. +1 de todos modos. – kentcdodds

+1

el problema con el uso de comillas simples (como sugirió) es que interpretará literalmente la nueva línea, vea mi edición. –

3

en Perl cualquier cadena que se construye con comillas dobles se interpolará, por lo que cualquier variable se reemplazará por su valor. Al igual que muchos otros idiomas si necesita imprimir un $, tendrá que escapar.

print "\$linenumber is:\n$linenumber"; 

O

print "\$linenumber is:\n" . $linenumber; 

O

printf "\$linenumber is:\n%s", $linenumber; 

Scalar Interpolation

2

Si cambia su código de

print "$linenumber is: \n" . $linenumber; 

a

print '$linenumber is:' . "\n" . $linenumber; 

o

print '$linenumber is:' . "\n$linenumber"; 

se imprimirá

$linenumber is: 
22 

Lo que me resulta útil cuando se desea imprimir un nombre de variable es utilizar comillas simples para que las variables dentro de la voluntad no debe traducirse a su valor, haciendo que el código sea más fácil de leer.

4

me gusta = método de operador:.

#!/usr/bin/perl 
use strict; 
use warnings; 

my $text .= "... contents ..."; # Append contents to the end of variable $text. 
$text .= $text; # Append variable $text contents to variable $text contents. 
print $text; # Prints "... contents ...... contents ..."