ハッシュの複数の要素を配列で取得したいとき
これは知らなかったな〜(と、これは、無邪気に喜んでいたら恐ろしい事実が発覚したキロクです。)
my $rh_data = {'a'=>1,'b'=>2,'c'=>3}; printf("%d,%d,%d\n",@{$rh_data}{qw(a b c)}); 結果: 1,2,3
Perl Hacks P.145 のコードを眺めていて気付きました。
Perl Hacks ―プロが教えるテクニック & ツール101選
- 作者: chromatic,Damian Conway,Curtis "Ovid" Poe,株式会社ロングテール,長尾高弘
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/01/23
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 62回
- この商品を含むブログ (45件) を見る
ちょっと思いもよらないコードなので、なぜこのようなアクセスが出来るかについて、次のように考えてみました。
@{$rh_data} をすることによって、配列('a',1,'b',2,'c',3) になり、 ('a',1,'b',2,'c',3)に{} をつけて参照することによって、結局ハッシュとして 評価されているのかな? ↓ んじゃ、配列に{} をつけてテストしてみよう my @d = qw(a 1 b 2 c 3); printf("%d,%d,%d\n",@d{qw(a b c)}); 結果: 0,0,0 …ダメじゃん orz
ん?もしや…
$hash{field} は、ハッシュの1要素を返すが、 @hash{qw/fields/} は、ハッシュの複数の要素を配列として返す機能がもともとあるのでは!? perlsh で実験。 main[1]$ @d = qw/1 2 3 4 5 6/; # 準備その1 1 2 3 4 5 6 main[2]$ %d = qw/a b c d e f/; # 準備その2 a b c d e f main[3]$ @d{a,c,e}; # いざ実験 b d f あーほんとだ!w @d{} で書いた場合は、@d (準備その1)はそもそも無視で、%d (準備その2)で定義した中の要素にアクセスできているな。 やべっ
技だと思ったのですが、そもそも技でも何でも無かったかも…。
これは恥ずかしい(><)