http://qs321.pair.com?node_id=663823


in reply to Re^4: last in a do while loop (for (;;))
in thread last in a do while loop

Don't know if/when this will get looked at but I was unaware that a do-while loop didn't operate like a loop so last doesn't "work" with it. My problem is I have a structure similar to this. I'm guessing what I need is a way to keep reading the next line in the file, but at times I had problems assigning $aVar = <AFile>. Would a similar loop construct with $aVar = <Afile> being the final statement in that bare loop work?
while(<AFile>) { if(found keyword) do{ process keyword and next few lines if(done processing){ last } }while(<AFile>); # do some post processing } # Continue processing after this in the same file

Replies are listed 'Best First'.
Re^6: last in a do while loop (for (;;))
by ikegami (Patriarch) on Jan 23, 2008 at 21:49 UTC

    For starters, I'm not sure why this is in this thread. You might benefit from starting a new one since more eyes will see your post.

    Sounds very convoluted. Have you thought about using functions? Not sure what your data looks like, so this may not fit without modification:

    sub read_block { my ($fh) = @_; my $header = <$fh>; return undef if !defined($header); my @block = $header; do { my $line = <$fh>; die "Unexpected end of file\n" if !defined($line); chomp($line); push @block, $line; while ($line !~ /footer/); return \@block; } while (my $block = read_block($fh)) { ...process block... }
      Did it here as I didn't feel like it needed a completely new topic. I'll probably stick with the bare block in the future. The data is generated by a program that does some artificial splitting of the lines if it has over 80 characters in a line so... to do anything useful with the data the lines need to be reordered. Thanks both of u.
        redo is usually good for that.
        while (<$fh>) { chomp; if (... && !eof($fh)) { $_ .= <$fh>; redo; } ... }
Re^6: last in a do while loop (for (;;))
by rir (Vicar) on Jan 23, 2008 at 17:46 UTC
    Update: Duplicative, nothing new here, move along.

    Add a block or single-pass loop around your do while.

    my $i = 0; { do { print $i++, $/; last if $i == 2; } while ( $i < 4); }
    Be well,
    rir