6. ハッシュ

初めてのPerl 第6版メモ。

6.1 ハッシュとは?

  • hash:配列と同様に任意個の値を格納できるが、個々の値の指定に名前(key)を使う。
  • ハッシュのキーはどんな文字列でも使えるが、ユニークでなければならない。値は同じものがいくつあっても構わない。
  • データが一定の順番で並んでいるわけではない。
  • キーは常に文字列に変換される。

6.2 ハッシュの要素にアクセスする

  • 要素にアクセスするにはキーをブラケットで囲んで指定する。
$hash{$some_key}
  • キーには文字列になる式を用いる。
  • その他の代入やアクセスの動作は配列やスカラーの場合とほぼ同じ。
6.2.1 ハッシュ全体を扱う
  • %hash
  • ハッシュへの代入はリストコンテキストになる。
  • 代入されるリストは(キー, 値, キー, 値, ...)となる。
  • 逆に、リストコンテキストにおけるハッシュの値はキーと値のペアを並べたものになるが、その順序は保証されない。
6.2.2 ハッシュの代入
  • ハッシュをハッシュへ代入した場合ハッシュがコピーされる。
  • reverseは逆引きのハッシュを生成する。重複する値がある場合、後のものが優先されるがハッシュの順序は保証されないためどれが採用されるかは不明となる。
6.2.3 太い矢印
  • コンマが必要な場所では常にコンマを太い矢印(=>)で書き換える事ができる。別名太ったコンマ。
  • 太ったコンマの左側に置かれた値は自動的にクォートされる(左側の値がPerl演算子のように見える場合を除く)。
my %last_name (
    fred => 'flintstone',
    ...
    betty => 'rubble',
);
  • リストの最後に置かれた余分なコンマは単に無視される。
  • クォートなしの書き方を裸のワード(bareword)と呼ぶ。barewordはハッシュへのアクセス時にも使える。ただし、bareword以外のものが入っていればそれは式として解釈される。

6.3 ハッシュ関数

6.3.1 keys関数とvalues関数
  • keys:全てのキーからなるリストを返す。
  • values:全ての値からなるリストを返す。
  • keys関数とvalues関数の値の順序は保証されないが、keysとvaluesの各々の順序は互いに対応するような順序となる。ただし、keysとvaluesの間でハッシュの内容を変更した場合はこの限りではない。
  • スカラーコンテキストではこれらの関数はキー/値のペア数を返す。
6.3.2 each関数
  • キー/値のペアを2要素リストとして返す。
  • 使用する度に次のペアを返す。
while ( ($key, $value) = each %hash) {
    ...
}

6.4 ハッシュの利用例

6.4.1 exists関数
  • exists関数はkeyが存在すれば真、存在しなければ偽を返す。
6.4.2 delete関数
  • delete関数は指定されたキー及び対応する値を削除する。
6.4.3 ハッシュの要素を変数展開する
  • ハッシュ個別の要素を変数展開することはできるが、ハッシュ全体を変数展開する要素は用意されていない。

6.5 %ENVハッシュ

  • Perlプログラムは他のプログラムと同様、ある環境(environment)のもとで実効される。
  • %ENVには環境の情報が入っている。
  • %ENVにはおそらくPATHキーが存在し、パスが入っている。
  • 環境変数を外部でセットしておけば、%ENVハッシュの一部としてプログラムからアクセスできる。