Итерация по значениям хеша в perl - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть хеш с, скажем, 20 значениями.

Это инициализируется следующим образом:

my $line = $_[0]->[0];

    foreach my $value ($line) {
        print $value;
    }

Теперь, когда я пытаюсь получить значение каждого хеша в строке $, он говорит: Использование неинициализированного значения в печати в строке file.pl 89

Есть ли способ перебирать каждое значение хэша?

Я тоже попробовал это с:

my %line = $_[0]->[0];

    foreach my $key (keys %line) {
        print %line->{$key};
    }

Но это тоже не работает: Найдена ссылка, где в файле file.pl ожидается строка четного размера в строке 89

Кто-нибудь знает, что делать? Это не должно быть так сложно ...

Ответы [ 4 ]

10 голосов
/ 10 ноября 2010

Для перебора значений в хэше:

for my $value (values %hash) {
  print $value;
}
3 голосов
/ 10 ноября 2010

Во-первых, вы должны понимать разницу между хешем и хеш-ссылкой.

Ваше первоначальное назначение $_[0]->[0] означает что-то вроде: принимает первый аргумент текущей функции ($_[0]), разыменовывает его (->) и считает, что это массив, и получает его первое значение ([0]) , Это значение не может быть списком или хэшем, оно должно быть скалярным (строка, целое число, число с плавающей запятой, ссылка).

Вот пример:

my %hash = ( MyKey => "MyValue");
my $hashref = \%hash;
# The next line print all elements of %hash
foreach (keys %hash) { print $_ }
# And is equivalent to
foreach (keys %{$hashref}) { print $_ }
$hash{MyKey} == $hashref->{MyKey}; # is true

Подробнее см. http://perldoc.perl.org/perlreftut.html.

3 голосов
/ 10 ноября 2010

$line в вашем первом примере это скаляр, а не хеш.

Если это ссылка на хеш, разыменуйте ее с %{$line}.

1 голос
/ 10 ноября 2010

Предупреждение говорит вам, что там ничего на $_[0]->[0]. Он не умирает и не говорит вам, что вы ничего не индексируете, поэтому $_[0], скорее всего, является arrayref, но в первом слоте ничего нет - или, возможно, он указывает на пустой массив.

  • Если бы это была пустая строка или 0, она бы не жаловалась.
  • Если бы там была какая-либо ссылка, вы могли бы напечатать что-нибудь, даже если бы только: BLAH(0x80af74). (Где «BLAH» - это «ARRAY», «HASH», «SCALAR», «REF», «GLOB», «IO», ...)

Я предлагаю вам сделать это:

use Data::Dumper;
say Data::Dumper->Dump( [ $_[0] ] ); # or even say Data::Dumper->Dump( [ \@_ ] )

, а затем посмотрите на вывод.

После того, как вы получили хеш-адрес в $_[0]->[0], тогда, если вам нужно перебрать хэш, лучшим способом будет:

while ( my ( $key, $value ) = each %$hashref ) { 
   do_stuff_with_key_and_value( $key, $value );
}

см. each

Наконец, кажется, что у вас какая-то путаница с символами. В последней части этой ссылки приведена приличная попытка объяснить, что сигилы ('$', '@', '%') не являются частью имени переменной, но указывают на то, что мы хотим получить от него. Проблемы компиляции Perl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...