piezocuttlefish has asked for the wisdom of the Perl Monks concerning the following question:

I'm solving exercise 15-1 in the Llama, and I've run across a peculiarity I don't understand. In my program, I use the following loop:

for ( print "Please enter your guess from " . MINGUESS . " to " . MA +XGUESS . ": "; <>; print "Try again. Please enter your new guess from " . MINGUE +SS . " to " . MAXGUESS . ": ") { chomp; when ( '' ) { last; } when ( 'quit' ) { last; } when ( $iTarget ) { last; } default { print "\tYour guess of $_ was too " . ($_ < $iTarget ? " +small." : "large.") . "\n"; } }

The first time through the loop, the code executes as expected. If a second time through is necessary, the program immediately dies with "Can't use when() outside a topicalizer at (line number corresponding to 'default' line).", before the third section of the for loop conditions is able to execute. Is a for loop not a sufficiently good topicalizer? What gives?

Replies are listed 'Best First'.
Re: When in the course of Perl topicalizers
by ikegami (Patriarch) on Jun 28, 2010 at 23:39 UTC

    Is a for loop not a sufficiently good topicalizer?

    It doesn't use or change any variables, so it doesn't make a good topicaliser at all.

    The documentation says you can use a foreach loop instead of given, and it doesn't mention you can use a C-style for loop (which is closer to a while loop than anything else) instead of given.

      Bummer. I think I get it. foreach and given always change the topic, whereas for and while aren't topicalizers; Perl just is nice and replaces <> with defined ($_ = <>).