in reply to Re: Finding part of a file
in thread Finding part of a file

my $begin = shift @ARGV; my $end = shift @ARGV; $_=<> until /^$begin$/; while (<>) { last if /^$end$/; print; }
This is what struck me as the most obvious solution, but, of course, there's more than one obvious way to do it...

Replies are listed 'Best First'.
Re: Re: Re: Finding part of a file
by belden (Friar) on Dec 05, 2001 at 11:28 UTC
    You can nest reads on an open filehandle. I didn't know
    this until looking at your code and playing with it a little;
    here's what I got.
    #!/usr/bin/perl $begin='banana'; $end='grape'; while(<DATA>) { /$begin/ ? eval { /$end/ ? last : print while (<DATA>) } : next } __DATA__ apple banana pear peach grape prange
    blyman
      That code produces the warning:
      Exiting eval via last at line 8, <DATA> line 5.
      when warnings are turned on.... I'm not entirely sure why 'last'ing out of an eval block is bad, but I do know that eval is overkill for what you've written. do is probably more appropriate. The following code issues no warnings:
      #!/usr/bin/perl -wT use strict; my $begin='banana'; my $end='grape'; while(<DATA>) { /^$begin$/ && do { /^$end$/ ? last : print while (<DATA>) } } __DATA__ apple banana pear peach grape orange
      Update: You might want to replace the last above with a next if you want multiple windows to print... For instance, it changes what gets printed using this data:
      __DATA__ banana pear peach grape orange banana cow pig grape
      Notice that 'cow' and 'pig' are between a second set of on/off toggles... last will skip them next will print them. Which is the desired behavior? Your guess is as good as mine.

      -Blake

        Yep, there's a reason I didn't include warnings in my code snippet :) Going to have to read up on eval vs die and figure out why eval is overkill in this case...

        Interestingly enough, I can goto outside of an eval block without any complaints:

        #!/usr/bin/perl use strict; use warnings; my $begin='banana'; my $end='grape'; while(<DATA>) { /$begin/ ? eval { /$end/ ? goto END : print while (<DATA>) } : next } END: exit; __DATA__ apple banana pear peach grape orange
        ...re your update - that's a neat trick that I'll have to tuck away.

        blyman