Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: GOTO considered (a necessary) evil?

by ferrency (Deacon)
on Jul 15, 2002 at 15:55 UTC ( [id://181834]=note: print w/replies, xml ) Need Help??


in reply to GOTO considered (a necessary) evil?

There are some benefits to using next or redo or a while or for loop instead of goto. One of those is, the perl compiler has more information about the structure of your code and its control flow, when you use something other than goto. I'm not going to make any uninformed assertions about the effects this has on optimization. Instead I'll bring up some more practical concerns.

If your target label in a goto is undefined, perl won't complain until it tries to actually execute the goto, even when using strict and warnings. If your goto is handling a "once in a thousand years" case, then you're likely not to notice this typo until it's too late. The same thing happens when a label gets deleted or changed inadvertantly. A case where the same label is used twice can cause other confusion, and I haven't seen use strict or warnings catch that case either.

If you are going to go through the trouble of making your code use strict, it's probably a good idea not to use code which subverts the strictness unnecessarily.

This is not to say "don't use goto," even though I tend not to like it. Just be aware of the potential consequences.

Finally, from perldoc -f goto:

The goto-LABEL form finds the statement labeled with LABEL and resumes execution there ... The author of Perl has never felt the need to use this form of goto (in Perl, that is--C is another matter).

Update:Abigail is right: labels on non-goto's have the same problem. I use labels on next when necessary, and much more frequently than I use goto. But I try not to use labels when they are not necessary, for the reasons I outlined above.

Alan

Replies are listed 'Best First'.
Re: GOTO considered (a necessary) evil?
by Abigail-II (Bishop) on Jul 15, 2002 at 16:27 UTC
    last, next and redo can take a label as well. And then you will have the same problems if you now point out with goto.

    Yet, next and friends having an optional label is seen as a feature, not a misfeature. It might very well be that the author of Perl had used the goto LABEL if he had not added optional labels to next, last and redo.

    Abigail

Re: Re: GOTO considered (a necessary) evil?
by Joost (Canon) on Jul 16, 2002 at 09:49 UTC
    If your target label in a goto is undefined, perl won't complain until it tries to actually execute the goto, even when using strict and warnings. If your goto is handling a "once in a thousand years" case, then you're likely not to notice this typo until it's too late.

    Ofcourse, you have the same problem if you use a subroutine/method call (though you would probably not use those in the same situation).

    Myself, I would prefer

    while (1) { .... .... last unless (EXPR); }
    Which makes very clear that this is a loop (even though it might not loop more than once 99% of the time) and it "forces" some structure (which is not always a bad thing), and it might make you see the problem from a new perspective - TIMTOWDI after all.
    -- Joost downtime n. The period during which a system is error-free and immune from user input.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://181834]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2024-03-29 00:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found