2014-08-29 92 views
0

爲什麼我的哈希hh的內容不變?在撥打func之後,我如何保留主要部分的更改?哈希內容不變

my @RR = (1,2); 
foreach(@RR) 
{ 
    my %hh; 
    &func(\%hh); 
    print "SIZE: ".keys(%hh)."\n"; 
} 

sub func 
{ 
    my %hh = %{$_[0]}; 
    my $n="noob"; 
    my $m="moon"; 
    $hh{$n}{$m}[0]="hey"; 
    $hh{$n}{$m}[1]="bye"; 
} 

輸出:

SIZE: 0 
SIZE: 0 
+2

您正在創建一個新的詞彙變量'%hh'用於for循環的每次迭代。 – TLP 2014-08-29 21:51:23

+0

我知道,但即使在每次迭代中,在調用'func'後,'%hh'仍然爲空。 – user3991583 2014-08-29 21:54:16

+0

您在子文件中創建'%hh'的新實例。它會隱藏循環中以前的'%hh'實例。您正在傳遞引用,但是取消引用它並在您的子文件夾中創建副本。 – TLP 2014-08-29 21:55:37

回答

2

您爲每個循環迭代,每個子使用而造成的%hh新副本。您通過引用傳遞參數,但這並不重要,因爲您無論如何都在子集內複製值。這:

my %foo = %$bar; 

..makes的$bar副本,並%foo任何更改不上$bar過去了。

這裏是你的腳本中的註釋版本:

foreach(@RR) 
{ 
    my %hh;      # new variable %hh created each loop iteration 
    &func(\%hh);     # hash passed by reference 
    print "SIZE: ".keys(%hh)."\n"; 
} 

sub func 
{ 
    my %hh = %{$_[0]};   # new variable %hh created, key/values copied 
    my $n="noob"; 
    my $m="moon"; 
    $hh{$n}{$m}[0]="hey";  # copy of %hh affected 
    $hh{$n}{$m}[1]="bye"; 
}        # copy of %hh goes out of scope, values lost 

如果你想這個工作預期,就需要使用真正的參考:

sub func { 
    my $ref = shift; 
    $ref->{"noob"}{"moon"}[0] = "hey"; 
    $ref->{"noob"}{"moon"}[1] = "bye"; 
} 
+0

我想避免使用'shift',因爲我有很多參數要通過。 – user3991583 2014-08-29 22:07:03

+0

然後執行'my($ arg1,$ arg2,$ hhref,$ arg4,$ arg5)= @ _' – ysth 2014-08-29 22:08:18

+0

@ user3991583這是無關緊要的。使用'shift'只是訪問'@ _'的一種方式。不知道你爲什麼認爲在使用許多參數時不能使用shift。 – TLP 2014-08-29 22:11:47