前節でハッシュの作り方と、個々の値へのアクセスの仕方を見てきました。 ここでは、ハッシュを操作するいくつかの関数を紹介します。
keys関数は、受け取ったハッシュのキーだけを取って来てリストにして返してくれます。 ただし、前節でも書いたとおり、キーの順序はばらばらです。 例えば、
%menu = (
"bread" => 80,
"milk" => 50,
"salad" => 100,
);
@key = keys(%menu);
とすると、@keyには"bread"、"milk"、"salad"が代入されます。keys関数が返すキーのリストを並べ替えるには、前章§3.3 配列を操作するで紹介したsort関数を使います。 上のハッシュ%menuに対して、
@sorted_key = sort(keys(%menu));
とすると、@sorted_keyには"bread"、"milk"、"salad"がこの順番で代入されます。 この2つの関数とforeachループ(§1.5 嬉しい悩み参照)を組み合わせることによって、キーと値を全て表示することが出来ます。
foreach $key (sort(keys(%menu))){
print $key, ": ", $menu{$key}, "\n";
};
keys関数がキーだけを取り出すのに対し、values関数はハッシュの値だけを取ってきてリストを作ってくれます。 keys関数同様、値の順序はばらばらですが、この2つの関数が返すリストの順番は、元のハッシュのキーと値の組に一致します。 ですから、
@key = keys(%menu);
としたときに$key[0]が"milk"ならば、
@value = values(%menu);
としたとき$value[0]は(キー"milk"に対する値である)50となるのです。
keys関数、values関数はそれぞれキー、値のリストを返しますが、これでは、それぞれのキーと値を結びつける作業が必要です。 each関数は、ハッシュのキーと値の2つの要素からなるリストを返します。
($key, $value) = each(%menu);
こうすると、$keyには%menuの最初のキーが、$valueにはその値が代入され、この操作を繰り返すたびに、%menuのキーと値の組を順番に取り出します。 そしてキーと値の組がなくなると、空のリストを返します。
delete関数はその名のとおり、指定されたキーと値を削除し、削除した値だけを返します。
$deleted = delete($menu{"milk"});
上のようにすると"milk"と50が削除され、$deletedには50が代入されます。
さて、これで第4章は終わりです。 第2,3,4章でPerlのデータ型であるスカラー、配列、ハッシュを見てきました。 僕の説明不足でなかなかわかりにくいところもあったかもしれませんが、いろいろなスクリプトを書いて実験してみてください。
次の章では、条件分岐やループ構造などについていくつか紹介していきます。