0

私はこれをします:

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>
4

3 に答える 3

5
my @items = [];

する必要があります

my @items = ();
于 2013-03-06T22:09:04.190 に答える
3

[]配列とその配列への参照を作成し、後者を返します。これは、以下の@items作成に加えて、2番目の配列への参照が入力されることを意味し@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;
于 2013-03-06T22:12:12.277 に答える
2

あなたの問題はあなたの最初の行です:

my @items = [];

そのはず:

my @items = ();

問題は、配列 @items の最初の要素に配列参照を割り当ててから、後で他の値の束をそれにプッシュすることです。

代わりに括弧を使用して初期化すると、空の配列が作成されます。これは、pushItem への呼び出しをコメント アウトしてスクリプトを実行すると、より明確になります。

于 2013-03-06T22:15:28.417 に答える