![]() |
| カレッヂ |
質問者 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裏技 |