Переменная, не видимая как определенная в foreach хэша

#perl #foreach

#perl #foreach

Вопрос:

 my $crazy_hash = {

  'One' => 1,

  'Two' => 1,

  'Three' => 1,

};


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

Ошибка, которую я получаю,:

Глобальный символ «%crazy_hash» требует явного имени пакета в строке blah blah

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

Комментарии:

1. попробуйте foreach my $num (keys %$crazy_hash)

Ответ №1:

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

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

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

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

Ответ №2:

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

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

Начиная с 5.14:

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