p243のdbmの項目で、下記プログラムを実行するのですが、%tankaがハッシュ化されていません。
何か間違いがあるでしょうか?
$dbname = "kudamono_db"; #dbmデータベースの規定ファイル名をここに埋め込む
dbmopen(%tanka,$dbname,undef) or die "can't open dbm:".$dbname;
while(<STDIN>){
($kudamono,$kosuu)=split;
print "$kudamono\t$tanka{$kudamono}\t$kosuu\t".
$tanka{$kudamono}*$kosuu."\n";
}
dbmclose(%tanka);
その本を読んだわけじゃないですが、おそらくこのプラグラムは、「kudamono_db」という DBM のファイルに、名称とその単価のデータが既に入っていて、名称と個数を入力すると、「名称」「単価」「個数」「総額」が表示される、という意図のプログラムだと思います。
なので、そもそも「kudamono_db」に名称と単価のデータが入っている事が前提で、入力した名称に該当するデータが無ければ、$tanaka{$kudamono} は何も表示されず、$tanka{$kudamono} * $kosuu は 0 になります。
おそらく、この例が出ている前後に、DBM のファイルを作るプログラム例があると思います。そのプログラムで DBM ファイルを作った後に、このプログラムを実行すると、意図した結果が得られると思います。
追記:
ご指摘のdbmはもちろん事前に作ってあります。
とりあえず、そのファイルが正しくできているか、というのは確認してますか?
DBM のファイルが正しく出来ていれば、下記のようなコードで、中身を表示する事ができます。
use Data::Dumper; $dbname = "kudamono_db"; dbmopen(%tanka, $dbname, undef) or die "can't open dbm:".$dbname; print Dumper(\%tanka); dbmclose(%tanka);
中身が入っていれば、下記のような出力が得られるはずです。
$VAR1 = { 'apple' => '100', 'banana' => '50' };
ご回答ありがとうございます。
ご指摘のdbmはもちろん事前に作ってあります。