Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

(tye)Re4: When to use Prototypes?

by tye (Sage)
on Nov 09, 2001 at 23:59 UTC ( #124457=note: print w/replies, xml ) Need Help??

in reply to Re: Re: (tye)Re: When to use Prototypes?
in thread When to use Prototypes?

Yes, that is one difference, but I find code that makes use of that difference to be a bit of a problem. I'd probably write HI_POST_PI()+5 if I noticed.

The difference that I'm talking about is that subroutines with a () prototype that also do nothing but return a value become compile-time constants. Perl can replace instances of calls to these with the constant returned at compile time, allowing lots of interesting tricks:

> Perl -MO=Deparse -w use strict; sub DEBUG() { 0 } sub SymRef() { "My::Package::hash" } sub PI() { 3.141592 } if( DEBUG ) { warn "Okay, we are debugging...\n"; do_lots_of_debugging_stuff(); } $My::Package::hash{key}= "value"; print SymRef->{key},$/; print PI()+5,$/; __END__ sub DEBUG () { 0; } sub SymRef () { 'My::Package::hash'; } sub PI () { 3.141592; } '???'; $My::Package::hash{'key'} = 'value'; print $My::Package::hash{'key'}, $/; print 8.141592, $/; - syntax OK
Without the () prototypes we'd get:
sub DEBUG { 0; } sub SymRef { 'My::Package::hash'; } sub PI { 3.141592; } if (DEBUG ) { warn "Okay, we are debugging...\n"; do_lots_of_debugging_stuff ; } $My::Package::hash{'key'} = 'value'; print SymRef()->{'key'}, $/; print PI() + 5, $/; - syntax OK
and, if we ran the code, we'd get:
Can't use string ("My::Package::hash") as a HASH ref while "strict refs" in use

        - tye (but my friends call me "Tye")

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2022-12-01 10:02 GMT
Find Nodes?
    Voting Booth?