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


in reply to Exiting eval via next: is that so bad?

Well, you should be aware of the fact that the next from within the eval jumps to the end of an enclosing loop, which might be a little bit surprising. Example:

my $var = 5; { eval {$var = 3; next}; $var = 4; } print $var; # 3 !!
The block after eval does not count as a loop block (same as do), so the loop commands next, redo and last work on the outer block. To make the eval block a loop block (so that you can redo it e.g.) double the braces like this:
eval {{ $i++; redo unless do_sth($i); }}

-- Hofmator

Replies are listed 'Best First'.
Re^2: Exiting eval via next: is that so bad?
by dd-b (Monk) on Sep 23, 2011 at 19:36 UTC

    Please forgive necromancy.

    In the case I just hit, I'm doing this:

    CLIENT: while (!exitflag) { eval { # Various things that might throw exceptions if (blah blah) { next CLIENT; } }; if ($@) { # Exception handling } }

    So, I'm not just exiting the eval, I'm exiting considerably more. AND I'm doing it by an explicit label, not implicitly, so I really shouldn't be confused about what I'm doing. I'd really prefer not to get this warning in the case when I'm using a loop label to exit a particular loop.

    (The big while loop is handling client connects as they come in, the eval inside it is to prevent unexpected errors from killing the whole server; they just abort the one connection. This is test code, the full version will fork of course, once it can handle the simple case.)

        In my mind, this wasn't a new question, it was a continuation of a discussion I'd found. Isn't the idea of searching first to avoid starting new questions when reasonably possible?

        Anyway, thanks for your suggestion of the "no warnings" pragma.