perlに関する質問です。深沢千尋さんの「すぐわかるPerl」を勉強しているのですが、

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);

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/19 13:43:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント100pt

その本を読んだわけじゃないですが、おそらくこのプラグラムは、「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'
        };
id:tentengu

ご回答ありがとうございます。

ご指摘のdbmはもちろん事前に作ってあります。

2011/10/19 12:18:33
  • id:taknt
    print "$kudamono\t$tanka{$kudamono}\t$kosuu\t".
    $tanka{$kudamono}*$kosuu."\n";

    ここで print されないってこと?
  • id:tentengu
    そうです。$tankaがハッシュ化されないため、$tanka{$kudamono}は表示されず、$tanka{$kudamono}*$kosuuは0になってしまします。ちなみに、dosでやっています。
  • id:JULY
    追記しました。

    > dosでやっています。

    というのは、ActivePerl をインストールして使っているのでしょうか?
    あるいは cygwin?

    とりあえず、Linux 環境で、適切な DBM ファイルを用意して、質問文のスクリプトを実行すると、正常に出力されました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません