in reply to Re^4: regular expression
in thread regular expression

Tou forgot to unset your flag
#!/usr/bin/perl use strict; use warnings; my $flag=0; while(<DATA>){ if (/\{AUTHOR\}/){ $flag=1; next; } if (/^\{/){ $flag=0; next; } print $_ if $flag; } __DATA__ {TAG} tag1 {AUTHOR} By June Fletcher JOURNAL {TAG} tag2 TOM MacCUBBIN {DATA} data1 {AUTHOR} Richard White {AUTHOR} MacCUBBIN {SOUR}

Replies are listed 'Best First'.
Re^6: regular expression
by vitoco (Hermit) on Aug 16, 2009 at 20:37 UTC
    Tou forgot to unset your flag

    No, the flag is being set with the result of the expression: $1 eq "AUTHOR"

    Moving the condition to the second line (bad idea, because the expression will be evaluated many times even if $tag does not change for some rows):

    my $tag = ""; while (<DATA>) { ($tag = $1, next) if /\{(\w+)\}/; print $_ if $tag eq "AUTHOR"; }

    Removing the next from the tricky array used to have 2 sentences being affected by the if condition to test for a line with braces:

    my $tag = ""; while (<DATA>) { $tag = $1 if /\{(\w+)\}/; next if /\{/; print $_ if $tag eq "AUTHOR"; }

    Too many evaluations of conditional expressions. Inefficient, but I guess you got the idea.

    BTW, I was assuming that braces won't appear on text lines...

    my $flag = 0; while (<DATA>) { $flag = ($1 eq "AUTHOR") if /^\{(\w+)\}$/; print $_ if $flag and not /^\{/; }