使用sprintf在数组上使用map

时间:2013-03-01 20:24:05

标签: perl

我有以下代码:

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"),但我正在努力学习将地图与sprintf结合使用

1 个答案:

答案 0 :(得分:6)

您在地图声明中使用@some_range的引用。我不确定你为什么认为这会起作用。

正确的方法是

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