2013-11-02 48 views
0

我試圖推2個陣列中VALUES。一個鍵,2個值---> 2倍的值是在我的情況陣列誤差在哈希鍵陣列

my %hash 

%hash{'one'} -->> is my key in hash 

my @array1= ('apple', 'banana', 'orange'); 

my @array2 =('banana', 'orange','papaya','cherry'); 

我堅持把這些陣列我hashkey

push @{$hash{'one'}}, [ @array1 ] 

push @{$hash{'one'}}, [ @array2 ] 

當我嘗試運行該程序,我得到一個錯誤:can't use string ("1") as an ARRAY ref while "stricts refs"

如果我我的代碼更改爲類似:

@{$hash{'one'}}= \@array1 

@{$hash{'one'}}= \@array2 

這也確實不工作。

回答

2

我想這裏可能會有一些困惑(無論是由你,還是由我,我都不知道是哪個)。

這一切都取決於你想要什麼你的最終數據結構的樣子。我相信你在找什麼就是與哈希%的關鍵「一」關聯的值是兩個元素,其中的每一個本身數組引用,像這樣的數組引用:

# We'll call this "STRUCT-ONE" 
%hash = (
    'one' => [ 
     ['apple', 'banana', 'orange'], 
     ['banana', 'orange','papaya','cherry'], 
    ], 
); 

。 ..或者,也許你代替打算爲了有僅一個數組引用作爲值,如下所示:

# Let's call this "STRUCT=TWO" 
%hash = (
    'one' => [ 
     ['apple', 'banana', 'orange', 'banana', 'orange','papaya','cherry'], 
    ], 
); 

的語法來填充每個這些結構的,這取決於上述你將是不同尋找。

對於每一個結果,你會初始化值的方法相同:

my %hash =(); 
my @array1= ('apple', 'banana', 'orange'); 
my @array2 =('banana', 'orange','papaya','cherry'); 

...,並且對於 「STRUCT-ONE」,你會寫是這樣的:

$hash{'one'} = []; 
push(@{$hash{'one'}}, [@array1]); 
push(@{$hash{'one'}}, [@array2]); 

。 ..或者這些最後兩行可以像這樣組合:

push(@{$hash{'one'}}, [@array1], [@array2]); 

或者,對於上面的「STRUCT-TWO」,您可以更改th是:

push(@{$hash{'one'}}, @array1, @array2); 

(請注意,我簡單地除去的「[]」匿名數組引用語法)。你會注意到我使用'[@ array1]'來創建一個新的匿名數組引用(並用現有數組的內容填充它(基本上是執行數組內容的一個副本) )),而不是使用反斜槓採取參照現有陣列「\ @ ARRAY1」。您選擇哪個選項取決於您的真正意圖。我選擇了前者,這樣你就有了一個獨立的數據結構(所以@ array1或@ array2的進一步修改不會影響你的%hash內容。但是,如果你有一個非常大的數組,並且不想複製它內存(你知道內容真的是不可變的),然後參考現有的數組可能是一個更好的選擇。

最後,我建議使用Data::Dumper作爲診斷工具來檢查你的數據結構實際上像(即,或明智地使用了Perl debugger的(如果你熟悉如何使用))

我希望幫助

+1

非常感謝。那件事真的幫了我很多。 我正在使用Dumper來檢查我的錯誤。 :) –

1

$hash{'one'}早已標量值1和你的代碼提示不能作爲數組引用。

可以,

$hash{'one'} = [] if ref($hash{'one'}) ne "ARRAY"; 
push @{$hash{'one'}}, [ @array1 ]; 
+0

喔..該死..
我不能代替值是多少? –

+0

我可以用上面的幫助推動陣列。非常感謝。 但是,雖然打印它,我只能看到'array1的櫻桃'和'array2的桔子' –

2

你試試這個?

$hash{'one'} =(); 
push $hash{'one'},@array1; 
+0

@ cppcoder-> ohh這個作品, 但它不讓我把** 2 **陣列放入*鍵* .. –

+0

@DeathMetal你可以繼續添加數組到哈希值。 – cppcoder

+0

我現在得到你。 :) –

2

簡單:

 

use Data::Dumper; 
my @array1 = ('apple', 'banana', 'orange'); 
my @array2 =('banana', 'orange','papaya','cherry'); 

my %hash; 
$hash{one} = [@array1]; 
push(@{ $hash{one} }, @array2); 
print Dumper(\%hash); 
 

輸出

 

$VAR1 = { 
      'one' => [ 
        'apple', 
        'banana', 
        'orange', 
        'banana', 
        'orange', 
        'papaya', 
        'cherry' 
        ] 
     }; 
 
+0

<<< *謝謝* –