Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

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?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (9)
As of 2014-09-22 11:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (189 votes), past polls