こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

perlで以下の動作が出来る機能を作っています。

perlで以下の動作が出来る機能を作っています。
1.ファイル名が載っているfname.txtを読み込む。
2.読み込んだファイル名を開く。
3.ファイルの内容を変換。
4.変換したファイル内容をnew_fileディレクトリに保存。※ファイル名はそのまま。
1~4までを作ったのですが、fname.txtで指定した全てのファイル名を変換して保存したいのに、一番最初に記載されてあるファイル名しか置換されません。書籍などで調べてもわからないのと今日中に製作したいのでここで質問しました。
ご教授お願いします。
以下にソースを貼ります。
#!/usr/local/bin/perl -w
use strict;
my $x = 0;
my $y = 0;
my $z = 0;
open(IN,"<"."fname.txt")or die "cannot open txt_file: $!";#fname.txtを開く
while(<IN>){
#chomp $_;#改行してファイル名を書き込んでいるので、改行を消去
my $fn = $_;
my @F = $fn;
foreach my $FNAME (@F){
open(FILE,"$FNAME")or die "cannot open txt_file: $!";#fname.txtに記載してあるファイルを開く
open(OUT,">". "new_file/$FNAME")or die "cannot write txt_file: $!";#new_fileを開いて書き込む
while(<FILE>){#以下、ファイルの置換内容
my @d;
if (m/^[X1-9]+ (.*)/s) {
($y,$z)=(0,0);
$d[0] = ++$x;
$d[1] = 0;
$d[2] = 0;
$_ = $d[0] . " " . $1;
}
if (m/^[X1-9]+\.[X1-9]+ (.*)/s) {
$z=0;
$d[0] = $x;
$d[1] = ++$y;
$d[2] = 0;
$_ = $d[0] . "." . $d[1] . " " . $1;
}
if (m/^[X1-9]+\.[X1-9]+\.[X1-9]+ (.*)/s){
$d[0] = $x;
$d[1] = $y;
$d[2] = ++$z;
$_ = $d[0] . "." . $d[1] . "." . $d[2] . " " . $1;
}
print OUT $_;
}
}
close(IN);
close(FILE);
close(OUT);
exit ;
}

投稿日時 - 2010-10-24 00:38:17

QNo.6271103

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

本題は終わっているので細かい点:
・こんなかわいそうな使い方をするくらいなら @d を使わなきゃいいのに.
・最後の if文に引っかかるやつはその前の if文に引っかかると思うんだけど, それでいいのかなぁ.

投稿日時 - 2010-10-25 11:46:50

ANo.2

exitに着目。

投稿日時 - 2010-10-24 01:27:33

ANo.1

> close(IN);
> close(FILE);
>close(OUT);
>exit ;

ここでINもcloseして、しかもexitで実行そのものを終了しているため、2行目以降を読みこんでないからではないですか?
括弧の対応をよく調べてください。

投稿日時 - 2010-10-24 01:21:48

あなたにオススメの質問