久しぶりに DB データが「ハッシュの配列」にセットされまくってる感じの Perl プログラムのメンテを行うことになったので、ハッシュ(連想配列)のリファレンスなどについてメモ。
まあ、Perl の多次元配列については、木本裕紀さんの「Perl学習サイト - サンプルコードPerl入門」サイトの中の「配列とハッシュで多次元データ構造を自由に操る」がそのまま参考になる。
なので、ここで書いているのはその補足。
ハッシュ(連想配列)を配列にセットした、いわゆる「ハッシュの配列」を扱う場合。
下のコードは、PostgreSQL から取得したデータをセットしてる例(余分な処理は削ってるので、「例外に対する処理が甘い」とか、そういうツッコミはなしで(笑))
@persons = ();
# DB から $sql の条件でデータ取得(例えば、クラス名簿とか)
$result = $Conn->exec($sql);
if (!$result->resultStatus eq PGRES_TUPLES_OK) {
# DB エラーなら処理を抜ける
exit;
}
# 人数分データを読み込む
for ($i = 0 ; $i < $result->ntuples ; $i++) {
# DB から取得した名前、性別、年齢をハッシュにセット
my %person = ();
$person{'name'} = $result->getvalue($i, $result->fnumber(name));
$person{'sex'} = $result->getvalue($i, $result->fnumber(sex));
$person{'age'} = $result->getvalue($i, $result->fnumber(age));
# ハッシュを配列にセット
push @persons, \%person;
}
これで、クラス名簿が「ハッシュの配列」にセットされる。
全員のデータを読みだそうとしたら、
foreach $person (@persons) {
foreach $key (keys %$person) {
$value = $person->{$key};
print "$key : $value\n";
}}
こうすれば抜き出せる。
結果は、
name : Masunorisex : mage : 23name : Beikosex : fage : 44.....name : Tarosex : mage : 18
こんな風に表示される。
では、全件出力するのではなく、最初の人のデータだけ読み出したいって場合。
例えば、一人目の人の性別を確認とか。
ポイントは、「ハッシュの配列」はただの配列ではなく、実際は「ハッシュのリファレンス」を要素に持つ「配列のリファレンス」ということ。
そのため、@persons を参照するには @$persons のように配列のデリファレンスを行なう必要あり。
print @$persons[0]->{'sex'};
このように書けばいいのね。これで「m」という結果が表示される。
参考にしていただいてありがとうごさいます!
こんにちは。
こちらこそ、詳細な記事内容に、大変助けられております。
ありがとうございます。