第9回 リファレンスと無名ハッシュ
さて、みなさん。
もう配列のリファレンスとデリファレンスはマスターされていることと思います。
リファレンスを取得するときは、
\
を変数に付ければよいですね。
デリファレンスするときの法則は
- \と同じだけの$で元にもどす。ただし、最後の記号はもとの変数に合わせる
- \と同じだけの$で元にもどす。ただし、最後の記号はもとの変数に合わせる。しかし、矢印を使う場合は、最後の記号は書かない
ですね。
では、ハッシュのリファレンスを取得してみましょう。
use strict; my %h = ('a'=>1, 'b'=>2, 'c'=>3); my $ref = \%h; for( keys %$ref ){ print "$_ : $$ref{$_}", "\n"; }
結果:
c : 3 a : 1 b : 2
簡単ですね。
では、「->」で、デリファレンスする例もみてみましょう。
use strict; my %h = ('a'=>1, 'b'=>2, 'c'=>3); my $ref = \%h; print "$ref->{'a'}", "\n"; print "$ref->{'b'}", "\n";
結果:
1 2
なんべんも 言いますが、
「=>」 は、キーと値を示す矢印
「->」 は、デリファレンスの矢印
です。混乱しないでくださいね。 キーと値の方がファット(太っちょ)なのです。
それでは、今までのところを絵にしておきたいと思います。
それでは、「無名ハッシュ」のご紹介です。
もう「無名」の意味はご存知ですね。%h と名前をつけていましたが、名前をつけずに一撃で $refにハッシュの場所を教えてくれる書き方、それが無名ハッシュです。ではどう書くのでしょうか?
つぎを使います。
{}
{ } ですよ〜
my $ref = {'a'=>1, 'b'=>2, 'c'=>3}; for( keys %$ref ){ print "$_ : $ref->{$_}", "\n"; }
結果:
c : 3 a : 1 b : 2
無名ハッシュの作り方の部分を絵にしておきましょう。
さて、つぎを見てください。
[ ] # 無名配列を作る記号 { } # 無名ハッシュを作る記号 $ref->[ ] # 無名配列の要素にアクセスするとき $ref->{ } # 無名ハッシュの要素にアクセウするとき
そうなんです。要素それ自体にアクセスするときと、無名をつくるときは記号が一緒なのです。
とまあ、そこはいいのですが、僕が無名ハッシュを知ったときに超絶悩んだのが、
ブロックとの違いでした。
# ブロック { my $x = 1; my $y = 2; } # 無名ハッシュ my $ref = { 'x'=>1, 'y'=>2 }; # 関数 sub hoge { my $x = 1; my $y = 2; }
ね、全部 { } を使ってるわけなですよ!!!
ただPerlは記号を使ってるところによってその記号の解釈をかえます。
関数だと、関数名の後ろに { } がきていますし、
無名ハッシュだと { } の中で => などを使っていますし、そもそも何かに代入させるために、右辺にきています。
このあたりは、Perlがよきにはからって解釈してくれます。
どうしても これは、ブロックじゃない!! 無名ハッシュを作っているところだ!!!と示したいなら、
my $ref = +{ 'x'=>1, 'y'=>2 };
と + をつける方法がありますが、付けなくてもいい場合が大半なので、つけない方がいいと思います。
僕がいままで普通に書いていた段階では + を付ける必要がある場面には出くわしませんでした。
ということで今回は、ハッシュのリファレンス/デリファレンス と 無名ハッシュをみてきました。
それでは また〜