第8回 ハッシュ

今回は、ハッシュです。これまた多くの言語でありますね。

JavaScriptだとまさにまんまハッシュだし、JavaにはMapっていうのがあったり、RubyにもHashっというのがあったりします。


というわけで、ハッシュの作り方とアクセスの仕方なんかを紹介しましょう(やりかたは、ここでは紹介しきれないくらい超いっぱいあります)。

use strict;

my %c = ('a'=>1, 'b'=>2, 'c'=>3);  # キー=>値, キー=>値, キー=>値 という形

print "$c{'a'}", "\n";
print "$c{'b'}", "\n";
print "$c{'c'}", "\n";

結果:

1
2
3


配列は、@でしたが、ハッシュは%になります。
やはり、ひとつひとつの要素を取り出したいときは、%を$に変えます。
なんで、%にしたのかと言うと、

%の左上が key 右下を value とみたててキーと値が1対1であるということを示しているからです。
key/value ということです。


さて、先ほどの %c を絵にして表現しておこうと思います。


Perlはメインメモリを意識しないでいいことを思い出すと、
key と valueの追加はつぎのようにできます。

use strict;

my %c = ('a'=>1, 'b'=>2, 'c'=>3);

$c{'e'} = 4;  # 'e'=>4 を %c に加えたことになる。

print "$c{'e'}", "\n";

結果:

4


keysというのを使うと、ハッシュのkeyだけを取得することができます。

use strict;

my %c = ('a'=>1, 'b'=>2, 'c'=>3);

$c{'e'} = 4;

my @array = keys %c;
print "$_", "\n" for @array;

結果:

e
c
a
b

おや!? キーが出力される順番が適当ですね。
そうなんです。 ハッシュのキーは特に順番はきまっていません。


keysを使えば、ハッシュの全キーを取得できることがわかりましたから、
ハッシュ全体を処理したいときは、こんな感じで処理できます。

use strict;

my %c = ('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5, 'f'=>6);

for( keys %c ){
 print "$_ : $c{$_}", "\n";
}

結果:

e : 5
c : 3
a : 1
b : 2
d : 4
f : 6


処理したいキーが全部でない場合は、

use strict;

my %c = ('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5, 'f'=>6);

for( 'a', 'c', 'e', 'f' ){
 print "$_ : $c{$_}", "\n";
}

結果:

a : 1
c : 3
e : 5
f : 6

このように、 forの ( )の中にキーを列挙してやればよいです。

forは、 ( )の中身をひとつずつとりだして、ぐるぐる回してくれる装置だということを今一度思い出してください。





さて、リファレンスで使った矢印記号は、「->」です。 マイナス記号と、大なり記号 でできています。
ハッシュで、キーと値を示す為につかった矢印は、「=>」です。 イコール記号と、大なり記号 でできています。
注意してください。


じつは、この => は、単なるカンマ「,」と大差ありません。
ハッシュは、次のように、

use strict;

my %c = ('a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5, 'f', 6); # => を , に置き換えた

for( keys %c ){
 print "$_ : $c{$_}", "\n";
}

=> を カンマ「,」に置き換えても問題なく動きます。
しかし これは強烈にわかりにくいです。 そこで、キーと値のペアを目立たさせるために、 => を作り出しました。

実は、 => と カンマ「,」は一点だけ違いがあります。

use strict;

my %c = ( a=>1, b=>2, c=>3, d=>4, e=>5, f=>6); # キーに注目

for( keys %c ){
 print "$_ : $c{$_}", "\n";
}

キーの部分を '(シングルクォート)で囲っていままで示していましたが、
=> を使えば、かってに補ってくれるのです。
ただ 僕は、'(シングルクォート)で囲っておくことをオススメします。



さて、配列もひとつひとつの要素にアクセスするときには、@を$に変えました。
ハッシュなら、%を$に変えました。それでは、Perlはどのように配列かハッシュか区別しているのでしょうか?

つぎの通りとなっています。




ハッシュは使いこなせると超絶便利なしろものですので、Perlでもじゃんじゃんハッシュを使っていってください。


では また〜