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

My homework:

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

No need to chomp... record terminator will be used in the output.

Replies are listed 'Best First'.
Re^5: regular expression
by Utilitarian (Vicar) on Aug 16, 2009 at 19:28 UTC
    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}
      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 /^\{/; }