Perl Perl_0
Perl 「 ハッシュ 」: ( Hash ) データの格納(0x50)
ハッシュ全体を 1 度に設定する
前回は、ハッシュの key と value を個別に設定する方法を確認しました。
今回は、ハッシュの key と value を 1 度に設定する方法を確認します。
既に確認した通り、ハッシュ全体は、シジル「 % 」で表します。
%my_hash
ハッシュ全体に対した key と value を設定する場合の最も単純な方法は次の様なものです。
%my_hash = ('key1', 'val1', 'key2', 'val2', 'key3', 'val3');
ハッシュ全体を表す「 %my_hash 」に対して、LIST 形式で値を渡しています。
ここで少し分かりにくいのは、LIST の内容が、「 key, value, key, value ... 」の順番になっていることです。
上の例では、「 key1 と val1 」、「 key2 と val2 」、「 key3 と val3 」がそれぞれ組になっています。
ということは、LIST の値は必ず偶数個でなければいけません。奇数個である場合は警告が出ます。
Odd number of elements in hash assignment at perogramfile line n.
数が奇数です エレメントの ハッシュに割り当てられた ...
ハッシュへのデータの格納では、より分かりやすい方法も用意されています。「 太い矢印 」あるいは「 太ったカンマ 」と呼ばれる「 => 」を利用したものです。
%my_hash = ('key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3', );
key と value の関係が「 => 」を通じて分かりやすく表現されています。
この場合の key の文字列に対しては、大抵の場合クォートを省略することが出来ます。大抵の場合とは、文字列が演算子を含まない場合です。
また、改行を利用して、より分かりやすく記述することも出来ます。
%my_hash = (
key1 => 'val1',
key2 => 'val2',
key3 => 'val3',
);
LIST の末尾にある「 , 」は、Perl の処理に影響は与えないので、本来は不要です。
けれども、ハッシュに新しいデータを追加する際に有用だと言われます。ペアの区切り文字としてプログラマ自体が利用するということだそうです。
なお、key のクォートが省略出来るのは、key は文字列のみで構成されると決まっているからです。と、認識しています。
おそらくこれと同じ理由で、個別の要素にアクセスする「 { } 」内でも、key を表す文字列へのクォートを省略出来ます ( ただし、演算子に間違えられる文字がない場合に限る )。
$my_hash{ key1 } = 'val1';
ハッシュ全体を配列に格納する
シジル「 % 」であらわすハッシュ全体の中身は、配列変数に移し替えることも出来ます。
@hash_array = %my_hash:
この場合、ハッシュはリストコンテキストに置かれたことになる訳ですが、リストコンテキストに置かれたハッシュは、key と value が連なったリストデータだと解釈されます。
そういう訳で、配列 @hash_array の中身は次の様になります。
key2 val2 key1 val1 key3 val3
key と value のペアは隣りあっていますが、ペアの順番がバラバラであることに注目します。
これは、ハッシュの中身が順不同であることを表していますが、key の直後には元々ペアであった value が格納されることは保証されています。
また、配列の中では、key と value の関係は意味を持っていないので、上記の場合は、「 key1 」がインデクス「 0 」、「 value1 」がインデクス「 1 」と続きます。
Perl では、この動作を「 ハッシュをほどく 」( unwind ) と呼ぶそうです。
0x50 -> 0x51 へ
次回は、演算子や関数を使ったハッシュの操作を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)