地球ウォーカー2

Scala, Python の勉強日記

初めてのPerl その4(5章)

前回の続き。今回で4回目。

5章 ハッシュ

  • keyとvalueの集合。
  • keyは常に文字列に変換される。
    • 50/20の場合、"2.5"
    • "50/20"の場合、"50/20"
  • 素数が大きくなるにつれて、内部的ハッシュ表を再構成している。
    • 要素が多くてもすばやくvalueを取得できる。
    • 例えば、要素が3個のときと300万個のときのアクセス時間はそんなに変わらない。
ハッシュを使う
  • $hash{$key}で要素にアクセス。
    • keyが存在しない場合、undefが返ってくる。
  • $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
  • values関数は、すべてのvalueからなるリストを返す*4
  • 要素に変更が無ければ、上記2関数で返ってくるリストの対応関係は保証される。
  • スカラーコンテキストでは、要素の個数を返す。
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ページ突破した!!

初めてのPerl
初めてのPerl
posted with amazlet at 09.09.14
ランダル・L. シュワルツ トム フェニックス
オライリージャパン
売り上げランキング: 13789

*1:なんか他に呼び方無いのかな

*2:オブジェクトリテラルの書き方に似てる(末尾のカンマ以外)。

*3:JavaのCollections#keySet的な。

*4:JavaのCollections#values的な。