perl中散列哈希的问题

dam*_*ola 1 perl hash

我在哈希散列中访问变量时遇到问题我不知道我做错了什么.调试hash%list1的值会给出一个undef,所以我无法得到我的值.

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};
    }
}


}
Run Code Online (Sandbox Code Playgroud)

FMc*_*FMc 5

在两个地方,您尝试将哈希引用分配给哈希,这会产生此警告:引用找到偶数大小的列表.

以下是您需要的两个编辑:

# 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}};
Run Code Online (Sandbox Code Playgroud)

有关复杂数据结构的有用且简要的讨论,请参阅perlreftut.

对于它的价值,counter()可以通过删除中间变量来简化您的方法而不会损失可读性.

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

或者,正如ysth所指出的那样,如果你不需要这些键:

    foreach my $author_digs (values %$tallies) {   
        print $dig, "\n" for values %$author_digs;
    }
Run Code Online (Sandbox Code Playgroud)