web-dev-qa-db-ja.com

ハッシュ参照でforeachを使用する方法は?

私はこのコードを持っています

foreach my $key (keys %ad_grp) {

    # Do something
}

動作します。

%ad_grpがなく、ハッシュへの参照$ad_grp_refがある場合、同じようになりますか?

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

Perl::Criticおよびdaximはスタイルを推奨します

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

読みやすさと保守の懸念から(したがって、%{ $ad_grp_ref }の代わりに%{ $ad_grp_obj[3]->get_ref() }を使用する必要がある場合、何を変更するかをよく考える必要はありません)

58
mob

Perl 5.14(現在Perl 5.13で機能します)では、 ハッシュリファレンスでキーを使用

use v5.13.7;

foreach my $key (keys $ad_grp_ref) {
    ...
}
8
oylenshpeegul

他の人が述べたように、参照を参照解除する必要があります。 keys関数では、引数がで始まる必要があります。

私の好み:

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

Conway によると:

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

誰を聞くべきかを推測してください...

Perlリファレンスドキュメント を読み通すこともできます。

ハッシュとリストのハッシュおよびハッシュのリストへの参照で多くのことを実行していることに気付いたら、 Object Oriented Perl の使用を検討することをお勧めします。 Perlのドキュメントには Nice little tutorials があります。

5
David W.

したがって、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以降では、この機能にプラグマは必要ありません。

2
Jonathan Cast