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

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

Replies are listed 'Best First'.
Re4: Finding part of a file
by blakem (Monsignor) on Dec 05, 2001 at 13:15 UTC
    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