Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: Re: Re: Avoiding user-input in sub calls.

by edan (Curate)
on Nov 03, 2003 at 07:41 UTC ( #304038=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Avoiding user-input in sub calls.
in thread Avoiding user-input in sub calls.

&{ $functions{$doit} };

Would be seen by Perl as:

"Take the value of $functions{$doit} and treat it as a sub name"

No, there's some confusion here about references. perlman:perlref is the definitive reference (no pun intended), but I'll try to give you the short answer.

The syntax &{ SOMETHING } is, as you correctly said, a dereference. It says "Treat SOMETHING as a code reference", which means that the subroutine referred to by SOMETHING is executed. That means that SOMETHING is taken to be a reference, and in the example given, that's just what it is, as is evidenced by the code:

my %functions = ('first' => \&one, 'second' => \&two );

That \&one syntax is creating a hard reference to the subroutine one().

If, however that SOMETHING is not actually a hard reference, but is just a plain old scalar, then the "value of the scalar is taken to be the name of a variable, rather than a direct link to a (possibly) anonymous value." (from perlman:perlfref). So if the code example would have looked like this:

my %functions = ('first' => 'one', 'second' => 'two' );

... then you would be using a symbolic reference, which is what you mean by "Take the value of $functions{$doit} and treat it as a sub name". NOTE that this whole Symbolic reference business is disallowed by use strict 'refs', meaning that our friend SOMETHING must be an actual reference, and not just a name. This is probably a Good Thing.

Hope this helps. And by the way, I think the syntax $coderef->() is preferable to the equivalent &{$coderef}, since I think it just looks clearer that you're calling a subroutine...


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://304038]
[holli]: the fricking beast will only eat dry food
[holli]: nothing else, not even minced meat or fish
[Discipulus]: see you nuns and monks!
[KurtZ]: mice?
[Discipulus]: your cat is dryarian holli
[holli]: not even remotely KurtZ. i did find feathers in the garden a few times though
[holli]: yet no body
[virtualsue]: I was called upon to remove a gnawed mouse carcass from the living room this morning

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (11)
As of 2017-11-21 12:44 GMT
Find Nodes?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:

    Results (300 votes). Check out past polls.