Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: Taking reference to function

by Freezy (Scribe)
on Apr 16, 2009 at 06:01 UTC ( #757848=note: print w/ replies, xml ) Need Help??


in reply to Re: Taking reference to function
in thread Taking reference to function

This behavior confuses me. EG:

my $string = "Hello."; my $string_ref = \$string; $string = "Bacon!"; print $$string_ref;
The above prints "Bacon!", as my intuition expects. Why does the coderef point to the old block?


Comment on Re^2: Taking reference to function
Download Code
Re^3: Taking reference to function
by syphilis (Canon) on Apr 16, 2009 at 06:20 UTC
    Why does the coderef point to the old block?

    That's not a code reference, it's a scalar reference.
    $string_ref is a reference to the scalar, $string. Doing a print $$string_ref; will print out whatever's *presently* in $string.

    Update: Oops ... looking at Freezy's post in the context of the entire thread, I think I might've missed the point somewhat in my reply.

    Cheers,
    Rob
Re^3: Taking reference to function
by ELISHEVA (Prior) on Apr 16, 2009 at 06:24 UTC

    Because the symbol foo and the coderef are different things. *foo = ... assigns a new coderef to the symbol foo. It doesn't redefine the coderef for the original sub foo, which is kind of like a constant.

    \&foo takes the address of a constant, not a variable. So it is analogous to \"Hello World" rather than \$some_var_holding_a_string. You can't reassign it any more than you can reassign the address of the string literal "Hello World".

    Well, almost so. Sub "literals" are more complex than a string. Redefine a string and you get a different string. Redefine a sub and you get a different association between sub name and body. So if you *really*, *really* were set on redefining sub foo itself, you could, but (a) you have to nudge Perl into compiling code at runtime and (b) you will get a warning about redefining things that are not supposed to be redefined:

    use strict; use warnings; sub sayHello { print "Hello, world!\n"; } sayHello(); eval q{sub sayHello { print "Bonjour, le monde!\n"; }}; sayHello();

    which outputs

    Hello, world! Subroutine sayHello redefined at (eval 1) line 1. Bonjour, le monde!

    Best, beth

    Update: added some explanation about difference between sub and string literals.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (17)
As of 2015-07-02 10:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (33 votes), past polls