ハッシュ
■この章で解説する組み込み関数
delete, keys, values, each, exists
■この章でできること
・ハッシュにキー、値を追加する
・ハッシュからキー、値を削除する
・ハッシュのキーを指定して値を取得する
・ハッシュの全てのキーを取得する
・ハッシュの要素数を取得する
・ハッシュの全ての値を取得する
・ハッシュのキーと値を反復して取り出す
・ハッシュにキーが存在するかどうかを調べる
・ハッシュを初期化する

 ハッシュはキー、値をペアにしたデータ型です。まずは、サンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# ハッシュのサンプル
# Author: "Perl Programming Tips"
#############################################

%hash1 = ("tanaka"=>333, "yamada"=>444, "sato"=>555);

# キー、値を追加
$hash1{"suzuki"} = 666;

# キー、値を削除
delete($hash1{"sato"});

# キーを指定して値を取得
$value = $hash1{"yamada"};
print "value:$value\n";

# 全てのキーを取得
@key = keys(%hash1);
print "key:@key\n";

# ハッシュの要素数を取得
$num = keys(%hash1);
print "num:$num\n";

# 全ての値を取得
@value = values(%hash1);
print "value:@value\n";

# キーと値を反復して取り出す
while (@pair = each(%hash1))
{
    print "pair:@pair\n";
}

# キーが存在するかどうかを調べる
print "key:tanaka " . exists($hash1{"tanaka"}) ."\n";
print "key:sato   " . exists($hash1{"sato"}) ."\n";

# ハッシュの初期化
%hash1 = ();
$num = keys(%hash1);
print "num:$num\n";

 実行結果は次のようになります。

[g@630m pl]$ perl hash01_01.pl
value:444
key:yamada suzuki tanaka
num:3
value:444 666 333
pair:yamada 444
pair:suzuki 666
pair:tanaka 333
key:tanaka 1
key:sato
num:0
[g@630m pl]$

 ハッシュの初期化時に初期値を設定するには、次のように記述します。

%ハッシュ名 = (キー=>値, キー=>値);

 また、ハッシュにキー、値を追加するには、次のように記述します。

$ハッシュ名{キー} = 値;

 ハッシュからキー、値を削除するには、delete関数を使います。

delete
ハッシュからキー、値を削除する。
書式
delete $hash{key}
delete @hash{@keys}
引数
hash:
ハッシュ
key:
キー
戻り値
なし

 ハッシュのキーを指定して対応する値を取得するには、次のように記述します。値はスカラー値なので、$ハッシュ名となることに注意してください。

$値 = $ハッシュ名{キー};

ハッシュから全てのキーを取得するには、keys関数を使います。また、keys関数の戻り値をスカラーコンテキストで取得した場合は、ハッシュの要素数が返ります。

keys
ハッシュから全てのキー、または要素数を取得する。
書式
keys %hash
引数
hash:
ハッシュ
戻り値
リストコンテキストの場合全てのキーからなるリスト、スカラーコンテキストの場合要素数

 これに対して、ハッシュから全ての値を取得するにはvalues関数を使います。

values
ハッシュから全ての値を取得する。
書式
valuss %hash
引数
hash:
ハッシュ
戻り値
全ての値からなるリスト

 ハッシュからキーと値のペアを1つずつ取得して反復処理をしたい場合は、each関数を使います。ハッシュは内部で反復子(iterator)を持っているので、each関数を繰り返し呼び出すことによって、キーと値を1つずつ取り出せるようになっています。

each
ハッシュからキーと値のペアを反復して取得する。
書式
each %hash
引数
hash:
ハッシュ
戻り値
リストコンテキストの場合、キーと値のペアからなる2値のリスト。最後まで取得したら空のリストを返す。スカラーコンテキストの場合、キーのみを返す。

 もし、反復子を途中でリセットしたい場合は、スカラーコンテキストでkeys関数を実行するとリセットされます。

 次に、ハッシュの中に特定のキーが存在するかどうかを調べるには、exists関数を使います。

exists
ハッシュの中に特定のキーが存在するかどうかを調べる。
書式
each $hash{$key}
引数
hash:
ハッシュ
key:
キー
戻り値
キーがハッシュに存在すれば(値が未定義であっても)真を返す。

 最後に、ハッシュを初期化したい場合は、次のように記述します。

%ハッシュ名 = ();