2011-08-21 5 views
7

Perché un nome di variabile seguito da un trattino basso non viene valutato correttamente durante l'interpolazione delle stringhe in Perl?Perché un nome di variabile seguito da un trattino basso non viene valutato correttamente durante l'interpolazione delle stringhe in 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

[! Usare sempre rigorosa e utilizzare sempre le avvertenze] (http://joelslinux.blogspot.com/2011/06/use-strict-and-warnings.html) –

risposta

18

$i_ è un identificatore valido, quindi è il tentativo di stampare il valore di tale variabile (che non è stato impostato, quindi è undef).

Accendere strict e warnings.

+0

Ho notato il tuo buddhabrot, Mat. Forse questo ti interesserebbe: https://github.com/buddhabrot/buddhabrot (non potevo raggiungerti in nessun altro modo quindi dovevo trovare un commento innocente da qualche parte). – buddhabrot

7

Mat ha ragione. Se hai davvero bisogno di questa sottolineatura immediatamente dopo il valore utilizza la barra rovesciata: "$i\_".

+2

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

+5

Preferisco di gran lunga' $ {i} 'sul backslash, dato che fanno cose diverse in altri contesti. – tchrist

+1

@tchrist, puoi elaborare? – Itamar

23

In aggiunta alle altre risposte, è possibile utilizzare la sintassi alternativa per le variabili che specificano:

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

Nota l'uso di parentesi graffe: { e } per specificare il nome della variabile. In caso di dubbio, puoi optare per questa sintassi.

3

Utilizzare sempre questi:

use strict; 
use warnings;