Переменная не видна как определено в foreach хеша - PullRequest
1 голос
/ 05 октября 2011
my $crazy_hash = {

  'One' => 1,

  'Two' => 1,

  'Three' => 1,

};


 foreach my $num (keys %crazy_hash) {
      #DoSomething    
  }

Я получаю сообщение об ошибке:

Глобальному символу "% crazy_hash" требуется явное имя пакета на бла-линии бла

Если я сделаю свой% crazy_hash и определю его в цикле, оно работает.Почему не работает как есть?

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Вы не определили хеш с именем %crazy_hash, вы определили скаляр $crazy_hash, который содержит ссылку на хеш.

Вы, вероятно, имеете в виду это:

my %crazy_hash = ( One => 1, ...

... или получить доступ к ключам с помощью keys %{$crazy_hash}, как предлагали другие; тогда вам нужно будет использовать $crazy_hash->{key} вместо $crazy_hash{key} для доступа к значению. Прочитайте perlreftut, если вам нужно понять ссылки.

3 голосов
/ 05 октября 2011

$crazy_hash является ссылкой на анонимный хеш. До 5.14 вам нужно разыменовать ссылку для ключей для работы:

for my $num (keys %{$crazy_hash}) {

Начиная с 5.14:

Начиная с Perl 5.14, ключи могут принимать скалярный EXPR, который должен содержать ссылку на необработанный хеш или массив. Аргумент будет разыменован автоматически. Этот аспект ключей считается очень экспериментальным. Точное поведение может измениться в будущей версии Perl.

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