Perl で「ハッシュの配列」を扱う場合のメモ

久しぶりに 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 : Masunori
sex : m
age : 23
name : Beiko
sex : f
age : 44
.....
name : Taro
sex : m
age : 18

こんな風に表示される。

では、全件出力するのではなく、最初の人のデータだけ読み出したいって場合。
例えば、一人目の人の性別を確認とか。

ポイントは、「ハッシュの配列」はただの配列ではなく、実際は「ハッシュのリファレンス」を要素に持つ「配列のリファレンス」ということ。
そのため、@persons を参照するには @$persons のように配列のデリファレンスを行なう必要あり。

print @$persons[0]->{'sex'};

このように書けばいいのね。これで「m」という結果が表示される。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Perl で「ハッシュの配列」を扱う場合のメモ

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/4407

コメント(2)

参考にしていただいてありがとうごさいます!

こんにちは。
こちらこそ、詳細な記事内容に、大変助けられております。
ありがとうございます。

コメントする

このブログ記事について

このページは、shinodaが2017年5月24日 16:12に書いたブログ記事です。

ひとつ前のブログ記事は「いやあ、なんとなくこってりラーメンに敗北したような夜」です。

次のブログ記事は「「第12回 日本酒燦々」に行ってみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら