Perl数组转储

时间:2013-03-06 22:07:43

标签: arrays perl output

我这样做:

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>

3 个答案:

答案 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的调用并运行脚本,这一点就会变得更加明显。