Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^2: naming anonymous subroutines inner variables

by writch (Sexton)
on Jun 22, 2016 at 21:46 UTC ( #1166315=note: print w/replies, xml ) Need Help??


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

This is actually the controlling issue. $_ doesn't work in any case, but either the $k or the $closure method work with either $self supplied and shifted or ignored and not shifted

  • Comment on Re^2: naming anonymous subroutines inner variables

Replies are listed 'Best First'.
Re^3: naming anonymous subroutines inner variables
by BrowserUk (Patriarch) on Jun 22, 2016 at 22:01 UTC
    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.
      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.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (7)
As of 2022-11-29 01:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?