2011-07-02 24 views
1

ハッシュのハッシュで変数にアクセスする際に問題があります。私が間違っていたことはわかりません。 hash%list1の値をデバッグするとundefが返されるため、値を取得できません。偶数サイズのリストがを期待ところ見つけ参考:あなたはこの警告になり、ハッシュへのハッシュリファレンスを割り当てるしようとしている2つの場所でperlのハッシュのハッシュに関する問題

use strict ; 
use warnings ; 
my $text = "The, big, fat, little, bastards"; 
my $Author = "Alex , Shuman ,Directory"; 
my %hashes = {1,2,3,40}; 
my %count =(); 
my @lst = split(",",$text); 
my $i = 0 ; 
my @Authors = split(",", $Author); 
foreach my $SingleAuthor(@Authors) 
{ 
    foreach my $dig (@lst) 
    { 

    $count{$SingleAuthor}{$dig}++; 
    } 
} 

counter(\%count); 

sub counter 
{ 
    my $ref = shift; 
    my @SingleAuthors = keys %$ref; 
    my %list1; 
    foreach my $SingleAuthor1(@SingleAuthors) 
    { 
    %list1 = $ref->{$SingleAuthor1}; 
    foreach my $dig1 (keys %list1) 
    { 

    print $ref->{$SingleAuthor1}->{$dig1}; 
    } 
} 


} 

答えて

5

。ここで

はあなたが必要な2つの編集は、以下のとおりです。

# I changed {} to(). 
# However, you never use %hashes, so I'm not sure why it's here at all. 
my %hashes = (1,2,3,40); 

# I added %{} around the right-hand side. 
%list1 = %{$ref->{$SingleAuthor1}}; 

は、複雑なデータ構造の有用かつ簡潔な議論のためperlreftutを参照してください。

counter()メソッドは、中間変数を削除することによって読みやすさを損なうことなく簡略化できます。

sub counter { 
    my $tallies = shift; 
    foreach my $author (keys %$tallies) { 
     foreach my $dig (keys %{$tallies->{$author}}) { 
      print $tallies->{$author}{$dig}, "\n"; 
     } 
    } 
} 

あるいは、ysthが指摘するように、このようにあなたが必要としない場合、キーは:

私はあなたのコードを実行した
foreach my $author_digs (values %$tallies) { 
     print $dig, "\n" for values %$author_digs; 
    } 
+1

場合、それは良い点@ysth代わり – ysth

+0

値をループすることにより、はるかに簡単にすることができます。 – FMc

4

、Perlは問題だった、まさに私に言いました。

$ ./hash 
Reference found where even-sized list expected at ./hash line 7. 
Reference found where even-sized list expected at ./hash line 30. 
Use of uninitialized value in print at ./hash line 34. 
Reference found where even-sized list expected at ./hash line 30. 
Use of uninitialized value in print at ./hash line 34. 
Reference found where even-sized list expected at ./hash line 30. 
Use of uninitialized value in print at ./hash line 34. 

これが不明な場合は、診断を有効にして詳細な説明を表示できます。それを見ている必要があります - $著者と$ DIGが実際に唯一のキーとして使用されている

$ perl -Mdiagnostics hash 
Reference found where even-sized list expected at hash line 7 (#1) 
    (W misc) You gave a single reference where Perl was expecting a list 
    with an even number of elements (for assignment to a hash). This usually 
    means that you used the anon hash constructor when you meant to use 
    parens. In any case, a hash requires key/value pairs. 

     %hash = { one => 1, two => 2, }; # WRONG 
     %hash = [ qw/ an anon array/]; # WRONG 
     %hash = (one => 1, two => 2,); # right 
     %hash = qw(one 1 two 2);   # also fine 
関連する問題