• 締切済み

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 ; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

exitに着目。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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

関連するQ&A