Beefy Boxes and Bandwidth Generously Provided by pair Networks DiBona
good chemistry is complicated,
and a little bit messy -LW

Re: BEGIN block and prototyped subroutines

by ikegami (Pope)
on Apr 18, 2010 at 08:30 UTC ( #835319=note: print w/ replies, xml ) Need Help??

in reply to BEGIN block and prototyped subroutines

You seem to misunderstand both BEGIN and prototypes.

Let's look at BEGIN first. It causes the enclosed code to be executed as soon as it is compiled.

For the following code:

print "a"; BEGIN { print "b"; } print "c";

the following happens:

  • print "a"; is compiled.
  • BEGIN { ... } is compiled.
    • print "b"; is compiled.
  • BEGIN { ... } is executed.
    • print "b"; is executed.
  • print "c"; is compiled.
  • Compilation finished. Execution begins.
  • print "a"; is executed.
  • print "c"; is executed.

BEGIN is completely useless around a sub definition because a sub definition doesn't produce any runnable code.

Now, let's look at prototypes. Prototypes affect how sub calls are parsed and they affect the code into which a sub call is compiled. Obviously, that means the prototype of a sub must be known at the time a call to the sub is encountered.

For the following code:

foo('bar'); sub foo($) { print "foo called: @_\n"; }
the following happens:
  • foo('bar') is compiled. foo hasn't been declared, so a stub with no prototype is created. No prototype exists, so parsing is not affected, and no check is done on the args.
  • sub foo($) { ... } is compiled. The prototype doesn't match the one that was previously declared, which means Perl used the wrong prototype when generating earlier calls to foo, so a warning is issued.
  • Compilation finished. Execution begins.
  • ...

You need to declare the sub before any calls to the sub are compiled. It's the only way the sub call can be affected by the prototype.

sob foo($); foo('bar'); sub foo($) { print "foo called: @_\n"; }

By the way, prototypes are by and large discouraged in Perl. They are not a good way to check the validity of arguments.

Comment on Re: BEGIN block and prototyped subroutines
Select or Download Code

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2014-03-16 13:42 GMT
Find Nodes?
    Voting Booth?

    Have you used a cryptocurrency?

    Results (326 votes), past polls