in reply to Finding part of a file

You could refer to good ol' regex if the flip-flop operator scares
use strict; my ($start, $end) = ("bar".$/, $/."xxx"); my $data = join "", <DATA>; my ($inbetween) = $data =~ /$start(.*?)$end/s; print $inbetween, $/; __DATA__ foo bar baz quux zab xxx foo
While not the most elegant of solutions (unless you're regex mad ;o) a little TMTOWTDI never hurt anyone, right?
HTH

broquaint

Replies are listed 'Best First'.
Re: Re: Finding part of a file
by Zed_Lopez (Chaplain) on Dec 05, 2001 at 03:17 UTC
    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...
      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