• ベストアンサー

dataファイルの特定の行から特定の行をダンプさせるには?

$ cat data.txt #No1. abc... #No2. def... #No3. ghi... #No4. jkl... #No5. mno... なるデータの、例えば#No2.から#No4.までのデータだけをダンプするのに、 open(IN,"data.txt"); my $flag=0; while(<IN>){ if ( $_ =~ /#No2./ && $flag == 0) { $flag=1; } if ( $_ =~ /#No5./ && $flag == 1) { $flag=0; } print if $flag==1; } close(IN) と書いてみましたが、もっと簡単に書く方法を以前見たことがあったように思うのですが、こう書けばよいのでは?というアイディアがあれば、ご教授いただけないでしょうか?

質問者が選んだベストアンサー

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

少なくとも if (/#No2./ && $flag == 0) { $flag = 1; } if (/#No5./ && $flag == 1) { $flag = 0; } は $flag = 1 if /#No2./; $flag = 0 if /#No5./; にできますね. あと, #No5 を出力していいなら while の中身を print if /#No2./ .. /#No5./; で置き換えることもできます. while (<IN>) { push(@lines, $_) if /#No2./ .. /#No5./; } print @lines[0 .. ($#lines-1)]; のように配列にして逃げることもできる... かな.

HoComeCome
質問者

お礼

>あと, #No5 を出力していいなら while の中身を print if /#No2./ .. /#No5./; で置き換えることもできます. 御回答ありがとうございます。 私の記憶にあったものはたしか、これです。

その他の回答 (2)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.3

ANo.1の方の $flag = 1 if /#No2./; $flag = 0 if /#No5./; の記述は、更に短くして $flag ^=1 if /#No2\.|#No5\./; という風にできますね。

HoComeCome
質問者

お礼

$flag ^=1 if /#No2\.|#No5\./; のような書き方は初めて見ました。 参考になりました。ありがとうございます。

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

例に書いてあるプログラムと同じ出力でいいのなら、 open(IN,"data.txt"); while(<IN>){ if(/#No2\./ .. /#No5\./){print;} } close(IN);

HoComeCome
質問者

お礼

御回答ありがとうございます。 No1の方と同様、 if(/#No2\./ .. /#No5\./){print;} この書き方が私の記憶にあったものです。 違う方から同じ解答がいただけ、確信できました。 ありがとうございました。

関連するQ&A