• 締切済み

perlで指定範囲を複数ファイルに分割する方法は?

お世話になります。 perlを使用して、 下記の元ファイル[infile.txt]よりstart~endの範囲を各テキストファイルに 分割出力する方法をご教授いただけないでしょうか。  ※出力ファイル名は元のファイル名 (infile) + 1行目の文字列(単語)にします。   例>>infile_1111.txt , infile_333.txt よろしくお願いいたします。 [infile.txt] aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

エラーの理由を感違いしていました。以下、訂正します。 (1) start end (2) start 1111end start2222 end 実際の処理対象に上記 (1) のような中身のないブロックがある、(2) のような中身の行に start または end 含まれている、ということが考えられます。 (1) の場合は書き出す行がないので無視し、(2) の場合は正常に処理されるようにプログラムを修正してみました。 use strict; my @content; while (<DATA>) { if (/^start$/ .. /^end$/) { chomp; push @content, $_ if !/^start$/ and !/^end$/; if (/^end$/ and @content) { print "infile_$content[0].txt\n", join("\n", @content), "\n\n"; # open OUT, ">infile_$content[0].txt" or die "Can't open: $!"; # print OUT join("\n", @content), "\n"; # close OUT; @content = (); } } } __DATA__ aaaa start end bbbb start 1111end start2222 end dddd eeee start 3333 4444 end

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

<DATA> の後ろの閉じ括弧を忘れました。すみません。 use strict; my @content; while (<DATA>) { .....

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

プログラムの冒頭を次のように変更すると、エラーが解消すると思います。 use strict; my @content; while (<DATA> { .....

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

スカラーコンテキストの範囲演算子を使うのが、一番簡単かと思います。次のプログラムでは、ファイル名も中身も画面に表示するようになっています。コメントアウトしてある3行を生かすと、ファイルにも書き出すようになります。 while (<DATA>) { if (/start/ .. /end/) { chomp; push @content, $_ if !/start/ and !/end/; if (/end/) { print "infile_$content[0].txt\n", join("\n", @content), "\n\n"; # open OUT, ">infile_$content[0].txt" or die "Can't open: $!"; # print OUT join("\n", @content), "\n"; # close OUT; @content = (); } } } __DATA__ aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

yontans
質問者

補足

ご回答ありがとうございます。 初心者で(/start/ .. /end/)の使い方がわからず悩んでました。 line9/10で下記のエラーが出てきたのですが、$contentの初期化をしても解消できませんでした。 Use of uninitialized value $content[0] in concatenation (.) or string at split.pl.... すみませんがよろしくお願いいたします。