Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^3: naming anonymous subroutines inner variables

by BrowserUk (Patriarch)
on Jun 22, 2016 at 22:01 UTC ( [id://1166317]=note: print w/replies, xml ) Need Help??


in reply to Re^2: naming anonymous subroutines inner variables
in thread naming anonymous subroutines inner variables

either the $k or the $closure method work

Be careful! Whilst the for my $name... works, it is dangerous:

my @names = qw[ the quick brown fox ]; undef %h; for my $alias ( @names ){ $h{ $alias } = sub { print $alias; $alias = 'fred'; ####### Mysterious action at a distance +here }; }; pp \%h; { brown => sub { "???" }, fox => sub { "???" }, quick => sub { "???" }, the => sub { "???" }, } for my $key ( keys %h ) { $h{ $key }->(); };; the fox brown quick print @names;; fred fred fred fred

With the for my $name ( ... ) method, the closures are and remain aliases to the source list in the for loop; which means that if you assign to the closure within the subroutine, you will cause spooky action at a distance to the content of that source.

And perhaps worse, changes to the source of the for list, will remotely change the contents of the closures:

[0]{} Perl> my @names = qw[ the quick brown fox ]; undef %h; for my $alias ( @names ){ $h{ $alias } = sub { print $alias; }; }; pp \%h; { brown => sub { "???" }, fox => sub { "???" }, quick => sub { "???" }, the => sub { "???" }, } $names[ 1 ] .= 'Mysterious changes'; ###### And again here! for my $key ( keys %h ) { $h{ $key }->(); };; the fox brown quickMysterious changes

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". I knew I was on the right track :)
In the absence of evidence, opinion is indistinguishable from prejudice. Not understood.

Replies are listed 'Best First'.
Re^4: naming anonymous subroutines inner variables
by AnomalousMonk (Archbishop) on Jun 22, 2016 at 23:52 UTC
    Be careful!

    Wise words. When I first posted this, I thought about adding some sort of note of caution about the aliasing, or just avoiding it altogether in the pseudo-code, but desisted because of concerns about minimizing changes to the OPed code and about brevity. The approaches here and here that entirely avoid aliasing are much better: an aliasing bug, if it manifests, can be a really nasty critter to deal with!


    Give a man a fish:  <%-{-{-{-<

      an aliasing bug, if it manifests, can be a really nasty critter to deal with!

      Indeed. I remember vividly several days and nights trying to track one such down whilst under pressure to complete. Not nice.

      The other side is that used with knowledge, caution and clear commentary warning, it can be an extremely powerful technique.


      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". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice. Not understood.
        ... used with knowledge ..., it can be an extremely powerful technique.

        With great power comes great responsibility — and perhaps a few sleepless nights!


        Give a man a fish:  <%-{-{-{-<

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2024-04-24 22:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found