我有以下代码:
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
结合使用
答案 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