2016-04-26 13 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

[Bashシェルの$ {var}、 "$ var"、 "$ {var}"の違いは何ですか?](http://stackoverflow.com/questions/18135451/what- var-var-and-the-the-bash-shellの違いです) – Emna

+2

@Emna:OP言語は* Perl *です... – MarcoS

+3

あなたのコードで 'use strict'を使用してください。 – eballes

答えて

7

%$HoH{$i}%{$HoH{$i}}であなたはハッシュリファレンスを作成しているときに、$ HOHのハッシュリファレンスを作ります$HoH{$i}、あなたが望むものです...そしてあなたのコードに:-)

+0

はい私は通常自分のコードでstrictを使用します。それは単なるテスト目的です。 :D。ご回答有難うございます。 :) – stenlytw

+2

@bounces、テストしてもそれを使用する必要があります!あなたのソースでstrictを使うときのエラーはかなり異なっています: 'グローバルシンボル" $ HoHは明示的なパッケージ名が必要です。それはあなたの質問に対する答えを与えてくれました。 – eballes

+0

@eballesしかし、それぞれのリファレンスは実験的であり、厳密な使用ではエラーが残っています。 – stenlytw

2

それは解決の異なる優先順位のためにハッシュとハッシュのサブスクリプション。それは$HoH{$i}の参照によって返された値がハッシュリファレンスであることを明白に述べているので、第2のバージョン(%{ $HoH{$i} })と一緒に動作します。

%$HoH{$i}は、%{ $HoH }{$i}と解釈されます。サブスクリプティングは式$HoHがハッシュリファレンスとして解釈された後に起こります。ハッシュリファレンスではありません。 %HoHはハッシュですが、$HoHは使用されません。つまり、未定義です。