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"),但我正在尝试学习结合使用 mapsprintf

4

1 回答 1

7

您在 map 语句中使用对的引用@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
于 2013-03-01T20:27:00.530 回答