Akihiro's Programmer Blog

Technology Notes for Personal

「初めてのPerl」 第六章

第六章から。

前回から間が開いてしまった。
色々一段落したため、再会。




第六章 ハッシュ

用語集

ハッシュ キーと値のペアを持つデータ構造。全体を表すときのシジルは%。
環境変数 環境情報は%ENVハッシュに格納されている。
イテレータ 反復子。配列やハッシュの要素に繰り返してアクセスする際の位置。




Point


  • ハッシュの要素にアクセスしたい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#  キー    値
#  'a' => 'A'
#  'b' => 'B'
#  'c' => 'C'

#キーaのAにアクセスするときは
print $hash{'a'}    #A
print $hash{a}      #A


  • 逆引き用のハッシュを作りたい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#  キー    値
#  'a' => 'A'
#  'b' => 'B'
#  'c' => 'C'

#こうすると
%hash = reverse %hash;

#こうなる
#  キー    値
#  'A' => 'a'
#  'B' => 'b'
#  'C' => 'c'

#ただし、元々のハッシュの値がユニークでなければ正確に処理してくれない


  • ハッシュを分かりやすく書きたい。
#これだと分かりにくいため
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#,の変わりに=>を使うと分かりやすくなる
my %hash = (
  'a' => 'A',
  'b' => 'B',
  'c' => 'C',
);


  • ハッシュのキー、もしくは値だけを取得したい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#keys関数はハッシュのキーをリストで返す
my @keys = keys %hash;

# ('a', 'b', 'c')

#values関数はハッシュの値をリストで返す
my @values = values %hash;

# ('A', 'B', 'C')

#ただし、順番はバラバラ
#ただキーと値の順は対応している('a'が最後にあれば'A'も最後にある)


  • ハッシュ全体に対して繰り返し処理をしたい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#こんな感じで繰り返し処理をする
while ( ($key, $value) = each %hash ) {
  print "$key => $value\n";
}

#'a' => 'A'
#'b' => 'B'
#'c' => 'C'

#処理内容
################################################
#eachによって%hashのキーと値のペアをリストで返し
#$keyと$valueにそれぞれキーと値を代入する
#  ↓
#リスト代入によって要素数が返され
#while文としては2はtrueとして判断される
#  ↓
#それを繰り返し%hashの要素の全てにアクセスし終わった時
#空リストが返され要素数は0となり
#while文としてはfalseと判断され繰り返し処理が終了する
################################################

#イテレータによってアクセスする要素は順番に処理される

#ただし、順番はバラバラ
#ただキーと値の順は対応している('a'が最後にあれば'A'も最後にある)


  • あるキーが存在しているか知りたい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#exists関数で指定したキーが存在するか分かる
exists $hash{a}    #true
exists $hash{x}    #false


  • 指定したキーの要素を削除したい。
#こんなハッシュがある時
my %hash = ('a', 'A', 'b', 'B', 'c', 'C');

#delete関数で指定したキーの要素を削除する
delete $hash{a}
exists $hash{a}    #false

#delete関数を使うこととundefを代入することは同義ではない
$hash{b} = undef;
exists $hash{b}    #true


#環境情報は%ENVハッシュに格納してある

#例えばPATHを取得したい場合
print $ENV{PATH};

#/usr/local/bin:/usr/bin:/sbin:/usr/sbin

#環境変数登録はOSとシェルに依存する




次回は

次回は第七章を予定。