Как использовать foreach со ссылкой на хеш? - PullRequest
25 голосов
/ 09 марта 2011

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

foreach my $key (keys %ad_grp) {

    # Do something
}

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

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

Ответы [ 4 ]

56 голосов
/ 09 марта 2011
foreach my $key (keys %$ad_grp_ref) {
    ...
}

Perl::Critic и даксим рекомендуют стиль

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

из-за проблем с удобочитаемостью и поддержкой (так что вам не нужно задумываться о том, что изменить, когда вам нужно использовать %{ $ad_grp_obj[3]->get_ref() } вместо %{ $ad_grp_ref })

8 голосов
/ 10 марта 2011

В Perl 5.14 (теперь он работает в Perl 5.13), мы сможем просто использовать ключи для ссылки на хэш

use v5.13.7;

foreach my $key (keys $ad_grp_ref) {
    ...
}
4 голосов
/ 09 марта 2011

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

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

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

Согласно Конвею :

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

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

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

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

2 голосов
/ 28 мая 2015

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

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