第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
           };

と + をつける方法がありますが、付けなくてもいい場合が大半なので、つけない方がいいと思います。
僕がいままで普通に書いていた段階では + を付ける必要がある場面には出くわしませんでした。



ということで今回は、ハッシュのリファレンス/デリファレンス と 無名ハッシュをみてきました。


それでは また〜