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

Re: How to call a sub-routine ref

by moritz (Cardinal)
on Oct 19, 2012 at 17:55 UTC ( [id://1000001]=note: print w/replies, xml ) Need Help??


in reply to How to call a sub-routine ref

I like the second one better, and don't see how it would be more confusing than the first one.

Replies are listed 'Best First'.
Re^2: How to call a sub-routine ref
by greengaroo (Hermit) on Oct 19, 2012 at 20:16 UTC

    Imagine this:

    &{$hashref->{'key'}}('key');

    vs.

    $hashref->{'key'}->('key');

    Don't you think the second could lead to confusions?

    I'm just trying to find what is best, I honestly prefer the first but I've never seen it until recently, so I am thinking maybe no one uses it because it may be harder to understand at first sight.

    There are no stupid questions, but there are a lot of inquisitive idiots.

      greengaroo:

      Odd, I find your examples a good case for using the second one. Again, different people will find different things more clear.

      When I use hashes, I generally use $$h{foo} in preference to $h->{foo}, primarily because it's easier to type, and I use hashes quite a bit. If I were trying to make it visually distinctive, I'd make the harder to type one be for the less frequently used case. Thus, I'd use something like:

      $$hashref{key}->('arg');

      To my eye, that stands out better. (But with my luck, it would blow up, so I'd better whip up a test...)

      $ cat t.pl use strict; use warnings; sub p { print "foo(", join(", ", @_), ")\n"; } my $hr = { key=>\&p }; $$hr{key}->('arg'); $ perl t.pl foo(arg)

      ...roboticus

      When your only tool is a hammer, all problems look like your thumb.

        I like the second rule in perlref.
        Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a BLOCK returning a reference of the correct type.

        Sure, the result is often ugly, but there are no exceptions or special cases. What more could my poor memory want.

        Bill

      For that particular case, you don't need either the -> or the &{}:

      sub x{ say "x got [ @_ ]"; };; $h{x} = \&x;; $href = \%h;; $href->{x}('fred','bill');; x got [ fred bill ]

      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      RIP Neil Armstrong

      I find the first one much harder to read. The difference between ( and { is subtle, but properly named variables ($handlers->{$event_name}->($event)) would make that irrelevant.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (2)
As of 2024-03-19 04:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found