2011-07-05 8 views

答えて

10
$i = 5; 
print "${\($i*10)}"; 

又は

print "@{[$i*10]}"; 

これらは、適切なタイプ(最初のインスタンスでスカラー、第二の配列)の参照を含むコードブロックの間接参照である「可変」を補間します。

もう一つの方法は、常に値としてキーを返すダミーのハッシュを持っているだろう:

use strict; 
use warnings; 

{ 
    package Tie::Hash::Dummy; 
    use Tie::Hash; 
    use parent -norequire => 'Tie::StdHash'; 
    sub FETCH { $_[1] } 
    tie our %Lookup, __PACKAGE__; 
} 

my $i = 5; 
print "$Tie::Hash::Dummy::Lookup{$i*10}"; 

もう一つの方法は、これが異なるから変数をバインドしますが、\N{}文字名前検索インターフェースを使用することです場所、およびコンパイル時間(だけでなく、文字列のevalを使用して、潜在的なセキュリティの問題)で:より良い

my $i; 
BEGIN { $i = 5 } 
BEGIN { $^H{'charnames'} = sub { eval $_[0] } } 
print "\N{$i*10}"; 

(このかもしれない作業charnamesハンドラがoverloを返した場合文字列化時に評価を実行したadedプロキシオブジェクトですが、試してみる時間がありません。)

もう一つの方法は、overload :: constant()で文字列定数ハンドラを設定することです。

+0

なぜ "" $ {\ $ i * 10} ";"、スカラーへの参照が機能しないのですか? – Learning

+1

\は優先順位が高いので、$ iを参照して10を掛けて、その結果をシンボリックリファレンスとして使用します。あなたは '' $ {\(EXPR)} ''の式全体を参照する(そして' $ {} 'で逆参照する)必要があります。 – ysth

+0

'\(EXPR)'は配列の参照として解釈されませんが、メンバが1つしかないのでスカラーの参照と同じものを評価しますか? – Learning

1

次を試すことができ、

print "{". $i*10. "}"; 
+0

引用符で囲みたい。 – Learning

0

あなたはハッシュにアクセスしようとしていますか?

もしそうでなければ、単純に次のようにしてください:print "{"($ i * 10) "}";

2
$i = 5; 
print "${\($i*10)}"; 

そうでないことをお勧めします。

更新:それは(多かれ少なかれ)であると等価:やる

printf("%s",$i*10); 

$i = 5; 
$j = ($i * 10); 
$k = \$j; 
print "${$k}"; 
+0

素晴らしいですが、どうですか? – Learning

+1

Perlは逆参照を '$ {EXPR}'と '@ {EXPR}'として補間するので、必要な値への参照を返す式を書くだけで済みます。 – salva

11

私は、あなたが "のprintf" を使用することをお勧め。

+4

他のすべてのオプションがありますが、これは正しい時間の99.999%です。 – ysth

関連する問題