我这样做:
my @items = [];
sub pushItem {
my $itemId = "i" . sprintf("%d", $_[0]);
push(@items, $itemId);
}
sub popItems {
$itemsXml = "<key>items</key>\n<array>\n";
foreach (@items) {
$itemsXml .= "<string>$_</string>\n";
}
$itemsXml .= "</array>\n";
return $itemsXml;
}
pushItem(0);
pushItem(1);
pushItem(2);
print popItems();
我明白了:
<key>items</key>
<array>
<string>ARRAY(0x7fa1730070d0)</string>
<string>i0</string>
<string>i1</string>
<string>i2</string>
</array>
问题当然是:
<string>ARRAY(0x7fa1730070d0)</string>
答案 0 :(得分:5)
my @items = [];
应该是
my @items = ();
答案 1 :(得分:3)
[]
创建一个数组和对该数组的引用,并返回后者。这意味着除了创建@items
之外,以下内容将@items
填充为对第二个数组的引用:
my @items = [];
你只想要
my @items;
如果您坚持要为其分配内容,则需要为其分配零标量列表,您可以按如下方式执行此操作:
my @items = ();
但实际上,这只是浪费(因为你正在清空一个空数组)并且它增加了不必要的复杂性(代码什么都不做)。
为了清楚起见,@items = ();
(与my @items = ();
相对)仍然有用,但很少见。我认为我使用它的唯一时间是以下形式的代码:
my @buf;
while (my $item = get()) {
if (check($item)) {
something(@buf);
@buf = ();
}
push @buf, $item;
}
something(@buf) if @buf;
答案 2 :(得分:2)
你的问题是你的第一行:
my @items = [];
应该是:
my @items = ();
问题是你已经为数组@items的第一个元素分配了一个数组引用,然后你将一堆其他值推送到它上面。
如果使用parens初始化它,它会执行您想要的操作,即创建一个空数组。如果您注释掉对pushItem的调用并运行脚本,这一点就会变得更加明显。