CGI-BBS > CGI > Perl > 名前をキーにして番号コードを取り出したい。


カレッヂ
カレッヂ


質問者 KTH  投稿日 7/9(水) 14:10:34
以前にも、数回書き込ませてもらっている者です。
今回はPerlについて、お聞きしたいと思います。

名前をキーにして、その名前に対応したコード番号を取り出し、CSVファイルに書き込む
Perlプログラムを作成中です。

ファイル名code.txtは以下の内容となっています。
AAA,001
BBB,002
CCC,003

これに対し、perlは

open (FILE, ">> $file");

dbmopen %CODE, "codedb", 0644;
open IN, "code.txt";
while (<IN>) {
$data = $_;
chop $data;
( $name, $code ) = split(/,/, $data);
$CODE{$name}=$code;
}
close IN;
dbmclose %CODE;

print FILE "$CODE{AAA}\n";

としています。
考えている通りにいけば、CSVファイルには001と書き込まれるはずなのですが、実際は何
も書き込まれず、空欄になっています。
これはどこが悪いのでしょうか。

申し訳ございませんが、教えていただけないでしょうか?

宜しくお願い致します。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:TeraPad
FTPソフト:FFFTP
サーバ移転:していない
改造:していない
CGI習熟度:firsttime

回答者 しゅんじ  [削除]  投稿日 7/16(水) 10:36:08
誰もレスが付かないみたいなので、お答えします。

書き込めない、理由として一つは、12行目でdbmclose を実施した後に、
14行目でdbmファイルを呼び出しています。
一度dbmファイルを閉じてしまっているので、呼び出せません。

それと、code.txtをWin系のエディタで編集していると、7行目のchop $data;も
問題となってきます。
chopコマンドは、無条件に末尾バイトを削ります。その場合、[\r]だけが残り、UNIX上では正しく表示されません。
chompコマンドは、末尾の改行を取り除きますが、Win系での改行は[\r\n]ですので、これも駄目です。
よって $data =~ s/\r\n//g; として改行を取り除く必要があります。
また、改行削除はchopよりも、chompを使った方が良いと思います。

直接関係はないですが、読み込み動作と、書き込み動作を、サブルーチン等で分けたほうが
見やすくなりますね。

以上を直すと、こうなります。改行削除は状況で変えてください。
#!/usr/local/bin/perl
#
#
use strict;

 my $read_file  = "code.txt";
 my $write_file = "code2.txt";
 my $codedb     = "codedb";

 undef(my %CODE);
 dbmopen(%CODE, "$codedb", 0644);
   open(IN, "<$read_file");
     while (<IN>) {
       my $data = $_;      $data =~ s/\r\n//g;    #改行
       my ($name, $code) = split(/\,/, $data);
       $CODE{$name}=$code;
     }
   close(IN);
 dbmclose(%CODE);

 dbmopen(%CODE, "$codedb", 0644);
   open(OUT, ">>$write_file");
     print OUT "$CODE{AAA}\r\n";    #Win系の改行
   close(OUT);
 dbmclose(%CODE);
exit;
質問者 KTH  [削除]  投稿日 7/17(木) 10:39:23
しゅんじさん、ご返信いただきありがとうございました。
#お礼が遅れて、ごめんなさい。

今回、dbmを使用したのは初めてだったので、いろいろと分からずじまいでしたが、しゅんじさんの丁寧な説明で、
ある程度理解することができました。

深く感謝します。ありがとうございました。

また、何かありましたら申し訳ございませんが、宜しくお願い致します。

このページは終了したので返信(回答)は書きこめません
 


Web裏技