dポイントプレゼントキャンペーン実施中!

$ 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)
と書いてみましたが、もっと簡単に書く方法を以前見たことがあったように思うのですが、こう書けばよいのでは?というアイディアがあれば、ご教授いただけないでしょうか?

A 回答 (3件)

少なくとも


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)];
のように配列にして逃げることもできる... かな.
    • good
    • 0
この回答へのお礼

>あと, #No5 を出力していいなら while の中身を
print if /#No2./ .. /#No5./;
で置き換えることもできます.

御回答ありがとうございます。
私の記憶にあったものはたしか、これです。

お礼日時:2006/04/03 21:22

ANo.1の方の


$flag = 1 if /#No2./;
$flag = 0 if /#No5./;
の記述は、更に短くして
$flag ^=1 if /#No2\.|#No5\./;
という風にできますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/04/03 21:25

例に書いてあるプログラムと同じ出力でいいのなら、


open(IN,"data.txt");
while(<IN>){
if(/#No2\./ .. /#No5\./){print;}
}
close(IN);
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

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

お礼日時:2006/04/03 21:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!