#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.