Подтвердить что ты не робот

Как использовать foreach с хеш-ссылкой?

У меня есть этот код

foreach my $key (keys %ad_grp) {

    # Do something
}

который работает.

Как бы это выглядело, если у меня нет %ad_grp, но ссылка, $ad_grp_ref, на хэш?

4b9b3361

Ответ 1

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 })

Ответ 3

Как утверждали другие, вы должны разыменовать ссылку. Функция keys требует, чтобы ее аргумент начинался с символа%:

Мои предпочтения:

foreach my $key (keys %{$ad_grp_ref}) {

Согласно Conway:

foreach my $key (keys %{ $ad_grp_ref }) {

Угадайте, кого вы должны слушать...

Возможно, вы захотите прочитать Документацию Perl Reference.

Если вы обнаружите, что делаете много вещей со ссылками на хеши и хэши списков и списки хэшей, вы можете начать думать об использовании Object Oriented Perl. Там много хороших небольших учебников в документации Perl.

Ответ 4

Итак, с 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 и более поздние версии не требуют каких-либо прагм для этой функции.