初めてのPerl その4(5章)
前回の続き。今回で4回目。
5章 ハッシュ
- keyとvalueの集合。
- keyは常に文字列に変換される。
50/20
の場合、"2.5"
"50/20"
の場合、"50/20"
- 要素数が大きくなるにつれて、内部的ハッシュ表を再構成している。
- 要素が多くてもすばやくvalueを取得できる。
- 例えば、要素が3個のときと300万個のときのアクセス時間はそんなに変わらない。
ハッシュを使う
$hash{$key}
で要素にアクセス。- keyが存在しない場合、
undef
が返ってくる。
- keyが存在しない場合、
$hash{$key} = value
で、新たな要素を追加。- すでに存在するkeyの場合、valueを上書きする。
ハッシュ全体を扱う
%
をつける。- ハッシュに対する代入は、リストコンテキストの代入になる。
%hash = ("foo", 5, "bar", 6, "hoge");
- リストコンテキストの場合、ハッシュの値はkeyとvalueのリストになる。
- keyの順序は保証されない。
- keyとvalueの順序は保証される。
@array = %hash; # ("foo", 5, "bar", 6) または ("bar", 6, "foo", 5) になる。 # "foo"の直後に5、"bar"の直後に6は保証される。
ハッシュからハッシュへ
- 内部的には、リストに変換してからハッシュを作成する。
- 逆引き用ハッシュの作り方(valueがユニークでない場合に限る):
%reverse_hash = reverse %hash;
太い矢印「=>
」*1
- カンマの代わり。
- カンマとの違いは、太い矢印の左側はquotedとして扱われること。
- ハッシュ用のリストを見やすくする*2。
- 末尾のカンマはあっても問題ない。
%hash = ( "foo" => "hoge", "bar" => "piyo", )
keys
関数、values
関数
keys
関数は、すべてのkeyからなるリストを返す*3。
each
関数
- ハッシュ全体に対する繰り返し処理をする。
- Iteratorによるアクセス。
- 実用上の唯一の使い方:
while ( ($key, $value) = each %hash) { print "$key => $value\n"; }
exists
関数
- あるkeyが存在するかどうかを判定する。
- 存在すれば真、しなければ偽を返す。
if (exists $hash{$key}) { # do something. }
delete
関数
- 指定したkeyを削除する。
- keyが存在しなければ何もしない。
- 警告もエラーも起こらない。
delete $hash{$key};
ハッシュの変数展開
- ハッシュ全体を変数展開する方法は無い。
- 変数展開するには、次のようにする:
foreach $person (keys %books) { if ($books{$person}) { print "$person has $books{$person} items.\n"; } }
その他 ― my
演算子について
- 変数全体だけが対象。
- ハッシュなどの1要素だけを対象とすることはできない。
やっと
100ページ突破した!!