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";
--------------------------------------------------
すずめ
ふな