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

[HOME] [BACK]

更新日: