カレッヂ |
質問者 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と書き込まれるはずなのですが、実際は何 も書き込まれず、空欄になっています。 これはどこが悪いのでしょうか。 申し訳ございませんが、教えていただけないでしょうか? 宜しくお願い致します。
プロバイダ参照: |
回答者 しゅんじ
[削除]
投稿日 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裏技 |