2016-04-26 140 views
3

%{$var}%$var之間的區別是什麼?我想這個代碼,但有錯誤:

each on reference is experimental at test.pl line 21. Type of argument to each on reference must be unblessed hashref or arrayref at test.pl line 21.

use feature 'say'; 

%HoH = (
    1 => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    2 => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    3 => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

for ($i = 1; $i <= 3; $i++) { 
    while (($family, $roles) = each %$HoH{$i}) { 
     say "$family: $roles"; 
    } 
} 

但這個代碼工作正常:

use feature 'say'; 

%HoH = (
    1 => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    2 => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    3 => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

for ($i = 1; $i <= 3; $i++) { 
    while (($family, $roles) = each %{$HoH{$i}}) { 
     say "$family: $roles"; 
    } 
} 
+0

可能重複[在$ {var},「$ var」和「$ {var}」在Bash shell中有什麼區別?](http://stackoverflow.com/questions/18135451/what- is-the-the-var-var-and-var-in-the-bash-shell) – Emna

+2

@Emna:OP語言是* Perl * ... – MarcoS

+3

在代碼中使用'use strict'。 – eballes

回答

7

隨着%$HoH{$i}你做$斛散列引用,而與%{$HoH{$i}}你犯了一個哈希引用$HoH{$i},這就是你想要的...而且,use strict對你的代碼:-)

+0

是的,我通常在我的代碼中使用strict。這只是爲了測試目的。 :d。感謝您的回答。 :) – stenlytw

+2

@bounces,即使在測試中,您也必須使用它!在源代碼中使用strict時的錯誤是非常不同的:'全局符號'$ HoH「需要明確的程序包名稱',這會給你提供你的問題的答案。 – eballes

+0

@eballes但是仍然有一個錯誤,「每個參考都是實驗性的」,嚴格使用。 – stenlytw

2

由於解析的優先級不同哈希與下標散列。它適用於第二個版本 - %{ $HoH{$i} } - 因爲您明確指出$HoH{$i}查找返回的值本身就是一個hashref。

%$HoH{$i}被解釋爲%{ $HoH }{$i} - 即。在將表達式$HoH解釋爲hashref之後發生下標 - 事實並非如此。 %HoH是一個散列,但不使用$HoH - 即未定義。