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

hi,,,i got problem using with labeled blocks.

my codes as follows:

#!perl/bin/perl use strict; @_ = qw/perl is great/; for (@_) { if ($_ eq "perl") { print "$_\n"; next; } else { next LABEL } LABEL: print "The word was: $_\n"; }

even though using labeled blocks ain't useful for this example, i just use it for the sake of my demonstration. but the catch in here is i couldn't get labeled blocks being used the right way. it errors something "Label not found for "next LABEL" at sample.pl line 14"... and also moving the label around inside the for loop control creates such compilation error. but when i put my label "LABEL:" before the for loop control it doesn't commit any compilation errors. but the problem is its not the one that i want labeled blocks to do for me. why is it so?

like this codes below:

#!perl/bin/perl use strict; @_ = qw/perl is great/; LABEL: for (@_) { if ($_ eq "perl") { print "$_\n"; next; } else { next LABEL } print "The word was: $_\n"; }

and also, when the statement "next LABEL" was executed it jumps to the label "LABEL:". then it executes the for loop iteration just as next operator does. well labeled blocks are really confusing. when does labeled blocks good for?

thanks in advance... keep deep and dark!

From: PerlPhi

Replies are listed 'Best First'.
Re: Perl Labeled Blocks
by BrowserUk (Patriarch) on May 19, 2007 at 09:28 UTC
    ... but the problem is its not the one that i want labeled blocks to do for me. why is it so?

    Because next is a loop control operator, not a goto. When you use next without a label, it transfers control to the top of the nearest enclosing loop.

    next LABEL; allows you to transfer control to an enclosing loop, other than the nearest. So, you can do:

    OUTER: for my $x ( 1 .. 10 ) { INNER:for my $y ( 1 .. 10 ) { #do stuff if( condition ) { next INNER; } else { next OUTER; } } }

    In order to do what you are attempting to do, you need to use a goto, not a loop operator:

    #!perl/bin/perl use strict; @_ = qw/perl is great/; for (@_) { if ($_ eq "perl") { print "$_\n"; next; } else { goto LABEL } LABEL: print "The word was: $_\n"; };; __OUTPUT__ perl The word was: is The word was: great

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re: Perl Labeled Blocks
by blazar (Canon) on May 19, 2007 at 09:31 UTC
    but the problem is its not the one that i want labeled blocks to do for me. why is it so?
    well labeled blocks are really confusing. when does labeled blocks good for?

    Well, next, last and redo are very specific "tools" that deal, in fact, with loops - even if they are in the form of bare blocks. What you show to want in the first example is a wilder thingy called goto, which is well known to be risky and is duly discouraged. In Perl, although it is provided, you should never feel the need to use it. Those other thingies mentioned above are "addomesticated" forms of goto and do not expose the same problems. So... I smell a delicate flavour of XY problem here: what are you really trying to do? That is, whatever it is, doing it with your approach may certainly be possible, but I'm sure that it could be possible to do it without a wild jump a.k.a. goto too.