У меня есть этот код
foreach my $key (keys %ad_grp) {
# Do something
}
который работает.
Как бы это выглядело, если у меня нет %ad_grp
, но ссылка, $ad_grp_ref
, на хэш?
У меня есть этот код
foreach my $key (keys %ad_grp) {
# Do something
}
который работает.
Как бы это выглядело, если у меня нет %ad_grp
, но ссылка, $ad_grp_ref
, на хэш?
foreach my $key (keys %$ad_grp_ref) {
...
}
Perl::Critic
и daxim рекомендуют стиль
foreach my $key (keys %{ $ad_grp_ref }) {
...
}
из соображений читаемости и обслуживания (так что вам не нужно много думать о том, что нужно изменить, когда вам нужно использовать %{ $ad_grp_obj[3]->get_ref() }
вместо %{ $ad_grp_ref }
)
В Perl 5.14 (теперь он работает в Perl 5.13), мы сможем просто использовать ключи в хеш-ссылке
use v5.13.7;
foreach my $key (keys $ad_grp_ref) {
...
}
Как утверждали другие, вы должны разыменовать ссылку. Функция keys
требует, чтобы ее аргумент начинался с символа%:
Мои предпочтения:
foreach my $key (keys %{$ad_grp_ref}) {
Согласно Conway:
foreach my $key (keys %{ $ad_grp_ref }) {
Угадайте, кого вы должны слушать...
Возможно, вы захотите прочитать Документацию Perl Reference.
Если вы обнаружите, что делаете много вещей со ссылками на хеши и хэши списков и списки хэшей, вы можете начать думать об использовании Object Oriented Perl. Там много хороших небольших учебников в документации Perl.
Итак, с Perl 5.20 новый ответ:
foreach my $key (keys $ad_grp_ref->%*) {
(что имеет преимущество прозрачной работы с более сложными выражениями:
foreach my $key (keys $ad_grp_obj[3]->get_ref()->%*) {
и др.)
Для полной документации см. perlref.
Примечание. В Perl версии 5.20 и 5.22 этот синтаксис считается экспериментальным, поэтому вам нужно
use feature 'postderef';
no warnings 'experimental::postderef';
вверху любого файла, который его использует. Perl 5.24 и более поздние версии не требуют каких-либо прагм для этой функции.