Проблемы с хэшем хэшей в perl - PullRequest
1 голос
/ 02 июля 2011

У меня проблема с доступом к переменным в хэше хэшей. Я не знаю, что я сделал неправильно.При отладке значения 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};
    }
}


}

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

В двух местах вы пытаетесь присвоить хеш-ссылку хешу, что приводит к этому предупреждению: Ссылка найдена там, где ожидается чётный список .

Вот две правки, которые вам нужны:

# 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;
    }
4 голосов
/ 02 июля 2011

Когда я запустил ваш код, 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.

Если неясно, вы можете включить диагностику, чтобы получить более подробные описания.

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...