Perl小技集3
[HOME] [BACK]ハッシュ変数と配列変数についてまとめてみました。
1.ハッシュの配列
これってCGIでは結構使う場面が多いのです。以下はハッシュの配列を定義しておいて
CGIで出力するチェックボックスフォームの文を自動生成する例です。
なお、下の例では$#koumokuには配列の最後のインデックス2が入っています。
@koumoku = ( { 'val' => "1", 'name' => "たばこ", }, { 'val' => "2", 'name' => "ライター", }, { 'val' => "3", 'name' => "葉巻", }, ); for( $i=0 ; $i <= $#koumoku ; $i++ ){ print "<input type=\"checkbox\" name=\"chk1\" value=\"$koumoku[$i]{'val'}\">"; print "$koumoku[$i]{'name'}<br>\n"; }
2.配列のハッシュ
どういう場面で使うのかと思っていたら使い道を見つけました。例えば以下の様なデータベース
テーブルが有るとします。
[Table animal]
No. | 分類名 | 名前 |
---|---|---|
1 | 鳥類 | はと |
2 | 哺乳類 | ねこ |
3 | 哺乳類 | いぬ |
4 | 鳥類 | カラス |
5 | 魚類 | 金魚 |
5個のレコードを表すために「分類名」をkeyとするハッシュを考えます。
しかしこのハッシュは同じkeyを持つハッシュが複数存在する事になります。
この様な時に配列のハッシュを生成すると便利な場合が有ります。
以下は1行単位の各フィールドをkeyとする
ハッシュへのリファレンスを返してくれる「fetchrow_hash」関数を使用した例です。
この関数はさまざまなRDB(RelationalDataBase)をPerlで使える様にするためのDBIというAPI(フリー)により提供されます。
(DBIに付いての詳細はこちら)
use DBI; $dbh = DBI->connect($database, $username, $auth); $sql = "select * from animal;"; #animal テーブルの全フィールドを選択 $sth = $dbh->prepare($sql); if(defined($rv = $sth->execute)){ while($hash_ref = $sth->fetchrow_hash){ #animalテーブルから1行ずつ取ってくる push(@{$rec{$hash_ref->{'分類名'}}},$hash_ref->{'名前'}); #「$hash_ref->{'分類名'}」というkeyを持つハッシュ「rec」は #同じkeyを持つ無名配列のリファレンスとなる。ここではこれを逆参照して #この配列にpushしている。 } }else{ print "error!! -- $sql\n"; } $rc = $sth->finish; $rc = $dbh->disconnect; foreach $w (@{$rec{鳥類}}){ print "$w -- 鳥類\n"; } foreach $w (@{$rec{哺乳類}}){ print "$w -- 哺乳類\n"; } foreach $w (@{$rec{魚類}}){ print "$w -- 魚類\n"; } -------------------------------------------------- はと -- 鳥類 カラス -- 鳥類 ねこ -- 哺乳類 いぬ -- 哺乳類 金魚 -- 魚類
上記の例はちょっと複雑でしたが、以下にわかりやすいサンプルを2つ掲載しておきます。
##まとめて代入## %rec = ( '鳥類' => ['はと','カラス'], '哺乳類' => ['いぬ','ねこ'], '魚類' => ['金魚'] ); print $rec{'鳥類'}[0],"\n"; print $rec{'哺乳類'}[1],"\n"; print $rec{'哺乳類'}->[1],"\n"; #もちろん逆参照演算子を省略しないで書くとこうなります。 print $rec{'魚類'}[0],"\n"; -------------------------------------------------- はと ねこ ねこ 金魚
上のソースコードに続いて
##無名配列に1個ずつpush## push(@{$rec{'鳥類'}},'すずめ'); push(@{$rec{'魚類'}},'ふな'); print $rec{'鳥類'}[2],"\n"; print $rec{'魚類'}[1],"\n"; -------------------------------------------------- すずめ ふな