2

次のコードがあります。

my @some_range = (6..10);
my @some_range_new = map(sprintf("I%03d ", $_), \@some_range);

say join(' ', @some_range_new)

出力は次のようになると思います。

I006 I007 I008 I009 I010

しかし、代わりに私は得る:

275738152

なんで?

注:できることはわかっていますがmy @some_range_new = ("I006".."I010")、 map を と組み合わせて使用​​する方法を学ぼうとしています。sprintf

4

1 に答える 1

7

@some_rangemap ステートメントでへの参照を使用します。なぜそれがうまくいくと思ったのかわかりません。

正しい方法は

map sprintf("I%03d", $_), @some_range;

つまり、バックスラッシュを削除するだけで、コードが機能します。

失敗する理由は、\@some_rangeによって数値として解釈されるため%dです。配列参照が数値として解釈されると、参照された配列のアドレスに評価されます。例えば:

$ perl -lwe '@a=1..10; $x = \@a; print $x; printf "I%03d", $x'
ARRAY(0x468c18)
I4623384
于 2013-03-01T20:27:00.530 に答える