Actually, if you've ever done much module/OO programming,
you've probably used goto quite a lot, particularly if
you write AUTOLOAD functions. From perltoot:
When Perl tries to call an undefined function in a
particular package and that function is not defined,
it looks for a function in that same package called
AUTOLOAD. If one exists, it's called with the same
arguments as the original function would have had.
The fully-qualified name of the function is stored
in that package's global variable $AUTOLOAD. Once
called, the function can do anything it would like,
including defining a new function by the right name,
and then doing a really fancy kind of goto right
to it, erasing itself from the call stack.
As such goto is used in quite a few modules, core or
otherwise. CGI.pm, for example. | [reply] [Watch: Dir/Any] [d/l] |
Ok, perhaps the question should read: "How many times have
you inserted the 'goto' keyword into one of your scripts?"
CGI.pm and most others simply use the goto as part of the
AUTOLOAD feature, so I let them slide....but, glancing through
the standard modules, there are some exceptions: sigtrap.pm,
autouse.pm, and (oh no!) even good old Carp.pm use 'goto'
as a way of reaching another part of their script. Bleh!
I'm still at 'never.'
| [reply] [Watch: Dir/Any] |
goto &longmess;
The purpose being that this magical goto erases the calling
function from the call stack, which is exactly why it's
used here: since longmess dumps out a stack trace, we don't
want shortmess showing up in the call stack.
So you should let Carp.pm slide, too. :)
BTW, I like the perlfunc entry for goto:
goto - create spaghetti code
| [reply] [Watch: Dir/Any] [d/l] [select] |
Maybe the question should read "what is the most goto's
you've used in a single script/program". I answered
"more than ten" even though I rarely use goto, just because
I've written so many scripts.
Adding a goto is usually better than duplicating code
and/or re-arranging a large and complex loop.
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] [d/l] [select] |