2017-03-05 57 views
0

爲什麼在創建以下數組@ test1和@ test2時會有所不同?Perl 2d數組推送

#!/bin/perl -w 
use Data::Dumper; 
use warnings; 
use strict; 

my @test1 = [ 
    ['note', 1], 
    ['note', 3] 
]; 

print Dumper(@test1); 

my @test2; 
push(@test2, ['note', 1]); 
push(@test2, ['note', 3]); 

print Dumper(@test2); 

Datadump用於測試1:

$VAR1 = [ 
     [ 
     'note', 
     1 
     ], 
     [ 
     'note', 
     3 
     ] 
    ]; 

Dumpt用於測試2:

$VAR1 = [ 
      'note', 
      1 
     ]; 
$VAR2 = [ 
      'note', 
      3 
     ]; 

是否有創造@ test1的與反覆推到@ TEST2相同的結果的可能性?

+0

試試'push(@ {$ test2 [0]},['note',1])''。還要注意'@array = [[1],[2]]'與@array =([1],[2])不同' –

回答

2

相反的:

my @test1 = [ 
    ['note', 1], 
    ['note', 3] 
]; 

你可能想:

my @test1 = (
    ['note', 1], 
    ['note', 3] 
); 

方括號將創建一個匿名數組,並返回一個參照新的陣列。因此@test1將包含一個標量值,它是對數組的引用。

而且傾銷的結構像一個數組時,它往往是更清晰,以便反斜線前綴它傳遞一個參考:

print Dumper(\@test2); 

其中給出:

$VAR1 = [ 
     [ 
     'note', 
     1 
     ], 
     [ 
     'note', 
     3 
     ] 
    ]; 

記住你的時候在一個Perl函數調用中傳遞一個數組,數組將被「展平」到參數列表中。

+0

謝謝!但我想獲得與test1中相同的結果,但使用了push! – Matthias

+0

這是一件不尋常的事情。在你最初的例子代碼中,@ test1是一個包含單個元素的數組,而@ test2是一個包含兩個元素的數組。 –