2013-03-06 61 views
0

我這樣做:Perl數組傾銷

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

[]創建一個陣列和該陣列的引用,並返回後者。這意味着下面的填充@items一起除了第二數組的引用創造@items

my @items = []; 

你只是想

my @items; 

如果硬要給它分配的東西,你會想分配零標量的列表它,你能做到這一點,如下所示:

my @items =(); 

但實際上,這只是一種浪費(因爲你清除空ARR唉),它增加了不必要的複雜性(代碼無所事事)。


只是要清楚,@items =();(相對於my @items =();)仍然是有用的,但很少。我想我已經用它的唯一的一次是在以下形式的代碼:

my @buf; 
while (my $item = get()) { 
    if (check($item)) { 
     something(@buf); 
     @buf =(); 
    } 

    push @buf, $item; 
} 

something(@buf) if @buf; 
+0

我在稍後清理數組,因此@items =()派上用場。謝謝!我接受你的解釋,因爲Miguel已經有很多upvotes了。感謝這兩個! – QED 2013-03-06 22:16:14

+1

是的,'@items =();'很方便(儘管這非常非常罕見)。 'my @items =();'因爲它清除了剛剛創建的數組(因此它已經清除),所以不方便。 – ikegami 2013-03-06 22:16:54

+1

爲我的回答添加了一些說明。 – ikegami 2013-03-06 22:22:00

5
my @items = []; 

應該是

my @items =(); 
2

你的問題是你的第一行:

my @items = []; 

它應該是:

my @items =(); 

問題在於你已經爲數組@items的第一個元素分配了一個數組引用,然後再向其上推入一堆其他值。

如果你使用parens代替它進行初始化,它會做你想做的事情,它會創建一個空數組。如果您將您的調用註釋爲pushItem並運行腳本,這會變得更加明顯。