- ベストアンサー
foreachの入れ子について。
あるディレクトリ内の全てのファイル名を取得し、 全てのファイルを開いてカンマ、ダブルクォーテーション付加の処理をし、 別ファイルへと出力する。と言ったものを以下のように作ったのですが、 入れ子のforeach{}内へ入って行きません、 foreachの入れ子は出来ないのでしょうか? それともプログラムが間違っているのでしょうか? どなたかご教授お願いいたします。 require "./jcode.pl"; # jcode.plの呼び出し #ディレクトリ表示 opendir(DIR01,"./TestData") || die "can not open dir"; @FileName = readdir(DIR01); closedir(DIR01) || die "can not close dir"; foreach $file (@FileName) { if ($file eq '.') {next;} # '.'の時ループを抜ける if ($file eq '..') {next;} # '..'の時ループを抜ける $FName = "./TestData/$file"; # ファイルのオープン open ( FILEHANDLE , "$FName") || die "ファイルを開けません :$!\n"; @line = <FILEIN>; close (FILEIN); foreach $line (@line){ ######################### print "TEST-->$line\n"; ######################### $line =~ s/ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ//g; $line =~ s/\"/\"\"/g; $line =~ s/\,\"\?/\"\,\"/g; $line =~ s/\"\,\?/\"\,\"/g; $line =~ s/\ |\ /\"\,\"/g; &jcode::sjis2euc(\$line,"z"); # sjis --> euc コードへ変換 if (length $line != 1){ chop($line); $cd_22 = chr(0x0022); $line = "$cd_22$line$cd_22"; $line =~ s/([^\LF])$/$1\n/; } } open (FILEOUT, ">./log/TEST.txt") or die; #上書き時 print FILEOUT @line; close (FILEOUT); } } exit;
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ファイルのopenで指定しているファイルハンドル名と、以降のファイルハンドル名が違っていますが、これが問題ではないでしょうか? No.1のalicia-yさんへの補足になりますが、foreach で指定した変数は各要素へのエイリアスになるので、変更は配列にも反映されますよ。
その他の回答 (1)
- alicia-y
- ベストアンサー率40% (85/208)
$line の内容を変更しても @line の内容が変更されないので 処理されていない様に見えるのでしょう。 foreach を for($i = 0;$i <= $#line; $i++){ に変更して $line を $line[$i] に修正すれば 動くと思いますが。
お礼
回答どうもありがとうございました。 確かに言われてみれば単純なミスでしたが、言われてみて気が付きました。 どうもありがとうございました。