|
||||
|
|
4章 ハッシュ(連想配列)
|
|
|
ハッシュとは
ハッシュとは簡単に言ってしまうと、文字列を添字とする配列 の事です。 組になる2つのスカラーで、最初のスカラー(添字)を 「 キー 」 と呼び、 2番目のスカラーを 「 値 」 と呼びます。 ハッシュではこの二つが対応づけられてデータを保持しています。 一つのキーに対応してデータが保存されるので簡易的なデータベースとして使用する事も出来ます。
Perlでのハッシュはプレフィクス ( % ) を前に付ける事で通常のスカラ変数やその他の変数と区別します。 ハッシュの要素が同一のデータ型でなくても格納する事が可能です。 個別要素へのアクセス ハッシュ全体に対して処理を行う場合はプレフィクス [ % ] を使用します。 しかしハッシュを構成している各要素はそれぞれスカラで構成されているため、各要素へアクセスする場合は配列と同じくプレフィクス [ $ ] を使用します。 しかしこれでは配列とハッシュの区別が付きません。 そこでこの区別はキー『 添字 』を表わすところで記述します。 配列では添え字を表す場合 [] を使用しましたがハッシュでは {} を使用します。 [ 配列 @hash の先頭の要素を表わす ]
$hash[0]
[ ハッシュ %hash のキー "0" に対応する要素を表わす ]
$hash{0}
ハッシュへの代入
ハッシュへの値の代入方法をいくつかご紹介します。 配列と同じように、まとめて初期化することも出来ますし、一つずつ要素に値を代入することも可能です。 ※サンプルで記述しているハッシュの例は Perl5 以上に対応した記述です。 Perl4 ではキー値をシングルコーテーション "'" で Perl4 を使う方は注意してください。
%Hash = ( "one", 1 , "two", 2 ,"three", 3 ) ;
以下のようにキー値、値、キー値、値の順で代入されていきます。
%Hash = ( "one" => 1 , "two" => 2 , "three" => 3 );
上のサンプルと結果は同等ですが、キー値と値の関係を明確に記述する事が出来ます (キー値 => 値の組で作成されます)。 好みだと思いますが作者はこちらの記述を好んで利用しています。
$Hash{five} = 5 ;
キー値 = "five"値 = 5 と対応して作成されます。
%Hash = () ;
空のハッシュを作成 ( ハッシュの初期化 ) をします。 参照
上でハッシュへの色々な代入方法を見ましたが、今回はハッシュに入っているデータを参照する方法をご紹介します。 サンプルで使っているハッシュは以下のような値が設定されているものとして見てください。
%Hash = ( "one" => 1 , "two" => 2 , "three" => 3 ) ;
print $Hash{two};
ハッシュのキー値"two"に対応づけられた [ 2 ] を出力します。
print %Hash;
ハッシュの全ての要素を出力します。 ただしこの時出力される文字列は区切り文字で丁寧に区切ってくれる訳ではなく、全て繋がって [ three3two2one1 ] と表示されてしまいます。 ※このようにハッシュ全体を出力する場合、出力される順番がどのようになるかは保証されません。 ハッシュ操作ハッシュ操作関数
keys
[通常の配列] = keys [ハッシュ] ;
名前のついたハッシュの全てのキーからなる通常の配列を返します。 返される配列の順序は決まっていませんが他の関数と同じです values
[通常の配列] = values [ハッシュ] ;
名前のついたハッシュの全てのデータからなる通常の配列を返します。 返される配列の順序は決まっていませんが他の関数と同じです each
( <キー値> , <値> ) = each [ハッシュ] ;
ハッシュから新しいデータを取得し、キー値とデータからなる要素が2つの配列を返します。 ハッシュが全て読まれた後にこの関数を実行すると未定義が返ります。 この関数は実際にハッシュからデータを抜き出す事はしないで参照のみです。 exists
[ 真|偽 ] = exists $ハッシュ{キー値} ;
対象のハッシュに指定したキー値が存在するか確認します。存在した場合は真を、存在しなければ偽を返します。ただしキー値が存在すれば真となるので、キー値に対応したデータが存在するかまでは確認してくれません。 delete
[ 削除されたデータ|偽 ] = delete $ハッシュ{キー値} ;
引数で指定した値をハッシュよりキー値、データの全てを削除します。 削除に成功すると削除した値を返し、失敗すると偽となる値を返します。 ハッシュの全ての要素に処理を行う [ foreachして全てのキー値を出力する ]
foreach $変数 ( keys( %ハッシュ名 ) ) {
処理 } 先ず keys 関数で キー値の配列を作成し、後は毎回 [ $変数 ] へ関数から戻された配列の要素が先頭から順に代入されます。全て参照し終わった時点でこの foreachブロックを終了します。 [ 配列の操作 ] も少し絡んできますので、そちらも参照していただけると理解しやすいです。 [ foreachして全てのキー値、データを出力する ]
foreach $key ( keys( %Hash ) ) {
print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } 上のサンプルに少し変更を加えて、取得したキー値からデータを参照しています。 [ whileして全てのキー値、データを出力する ]
while ( ( $key , $value ) = each %Hash ){
print "キー値 : $key\n"; print "値 : $value \n " ; } each 関数で毎回ハッシュにあるキー値とデータの組み合わせを1つずつ取得していきます。 全部参照し終わった時点で関数より未定義が返るので while の繰り返しを終了します。 [ 数値に対応する曜日を出力するプログラムを作ってみる ]
%weekday =(
1=>'Sunday', 2=>'Monday', 3=>'Tuesday', 4=>'Wednesday', 5=>'Thursday', 6=>'Friday', 7=>'Saturday'); if( exists $weekday{$ARGV[0]}){ print $weekday{$ARGV[0]}; }else{ print "範囲外です!!"; } コマンドライン引数で数値を指定してスクリプトを実行すると 渡された値が 1の時は"Sunday" 7の時は"Saturday" と対応した曜日が表示されます。 ハッシュを2〜9行目で初期化しその後に existsでキー値が存在するか確認します、存在すれば対応するデータを存在しなければエラーメッセージを出力します。 環境変数 「 %ENV 」
Perlでは特別なハッシュ [ %ENV ] を用いシステムの環境変数を参照、設定する事が出来ます。 Perlでは変数に値を入れておくことで、スクリプト内のさまざまな場所からその値を参照する事が出来ました。
環境変数とは簡単に言ってしまうと、システムが保持している変数のようなもので、様々なアプリケーションからその変数にアクセスすることで、システムが用意している値を参照する事が出来ます。 実際に見てみたい方は [ こちら ] をクリックして下さい。 [ システムに登録されているパスを表示する ]
print $ENV{PATH} ;
CGIで使用する主な環境変数 これらの環境変数は Perlで CGIスクリプトを作成する際に使用する機会が増えてきます。 例えば、HTML側から値を受け取って処理する CGIスクリプトを作成する場合、HTMLから渡されるデータの受け渡しに環境変数が使用されます。 CGIスクリプトでは、この値を参照するために %ENV にアクセスして渡されたデータを取得します。
|