in reply to Re^2: last in a do while loop
in thread last in a do while loop

I'd prefer while (1) { ... } to for (;;) { ... }. Looks easier to understand to me.

Replies are listed 'Best First'.
Re^4: last in a do while loop (for (;;))
by ikegami (Patriarch) on Nov 03, 2006 at 21:38 UTC

    There's one significant advantage (from the reader's point of view) to while (1):

    • The meaning of while (1) is straightforward to deduce by someone who has never seen it, whereas the meaning of for (;;) is not.

    There are minor advantages (from the reader's point of view) to for (;;):

    • for (;;) has no expression to read, while while (1) does. (Note the addition of loop { ... } in Perl 6.)

    • "(;;)" can be read as "ever". "For ever" sounds better than "while one", "while true" or "while ever" (and requires no mental backtracking). "While not done" would be a great reading, but translating "1" to "not done" is a stretch.

    • for (;;) is visually distinctive from naturally ending loops.

    Update: hum... while (!0) could be read as "while not done"...

      Well, we could write while (not 'done') { ... }, but even though it would work and it would read fine, I think it would actually confuse people ;-)

      Update: while ('not done') { ... } of course. Sorry. I guess I should not be here at 1am. Thanks Sidhekin.

      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

        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... }
        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,