2011-08-21 3 views
7

Perlで文字列を補間する際に、変数名の後ろにアンダースコアが正しく評価されないのはなぜですか?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

[常に厳格な使用と常に警告を使用!](http://joelslinux.blogspot.com/2011/06/use-strict-and-warnings.html) –

答えて

18

$i_有効な識別子であるので、(それがundefあるので、あなたが、設定していない)、その変数の値を印刷しようとしています。

strictwarningsをオンにします。

+0

私はあなたのbuddhabrotに気づいた、マット。おそらく、これはあなたに興味があります:https://github.com/buddhabrot/buddhabrot(私はあなたにどこかで無邪気なコメントを見つけなければならなかったので、他の方法で連絡することはできませんでした)。 – buddhabrot

7

マットが正しいです。値の直後にアンダースコアが本当に必要な場合は、バックスラッシュ:"$i\_"を使用します。

+2

'print 'i_ ='です。 $ i。 "_ \ n"; ' –

+5

バックスラッシュよりも' $ {i} 'の方がはるかに好きです。 – tchrist

+1

@ tchrist、あなたは精巧にできますか? – Itamar

23

他の回答に加えて、あなたは、変数を指定するための代替構文を使用できます。変数名を指定する{}

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

を中括弧の使用を注意してください。疑わしいときはいつでも、あなたはこの構文を選ぶかもしれません。

3

常にこれらを使用します。

use strict; 
use warnings; 
関連する問題