2011-08-21 6 views
7

¿Por qué un nombre de variable seguido de un guión bajo no se ha evaluado correctamente durante la interpolación de cadenas en Perl?¿Por qué un nombre de variable seguido de un guión bajo no se ha evaluado correctamente durante la interpolación de cadenas en Perl?

my $i = 3; 

print "i = $i\n"; # works, prints "i = 3" 
print "_i = _$i\n"; # works, prints "_i = _3" 
print "i_ = $i_\n"; # FAILS, prints "i_ = " 
print "_i_ = _$i_\n"; # sort of works, prints "_i_ = _" 
+10

[Utilice siempre estricta y siempre utilizar advertencias] (http://joelslinux.blogspot.com/2011/06/use-strict-and-warnings.html) –

Respuesta

18

$i_ es un identificador válido, por lo que está tratando de imprimir el valor de esa variable (que no se ha establecido, por lo que es undef).

Encienda strict y warnings.

+0

Me di cuenta de tu buddhabrot, Mat. Quizás esto te interese: https://github.com/buddhabrot/buddhabrot (no pude contactarte de ninguna otra manera, así que tuve que encontrar un comentario inocente en alguna parte). – buddhabrot

7

Mat tiene razón. Si realmente necesita ese guión bajo inmediatamente después del valor, use la barra invertida: "$i\_".

+2

'imprimir 'i_ ='. $ i. "_ \ n"; ' –

+5

Prefiero' $ {i} 'sobre la barra diagonal inversa, ya que hacen cosas diferentes en otros contextos. – tchrist

+1

@tchrist, ¿pueden dar más detalles? – Itamar

23

Además de las otras respuestas, puede utilizar la sintaxis alternativa para las variables que especifican:

print "i_ = ${i}_\n"; 

Nota el uso de llaves: { y } para especificar el nombre de la variable. Siempre que tenga dudas, puede optar por esta sintaxis.

3

Siempre use los siguientes:

use strict; 
use warnings; 
Cuestiones relacionadas