http://www.perlmonks.org?node_id=716580


in reply to Re^3: Generate the perl sequence 1, 11, 111, ....
in thread Generate the perl sequence 1, 11, 111, ....

On the other hand, it looks to me that map is somewhat more magical than the examples in perlsub; if you call
map (sub { "1" x $_ }, (1..10));
it returns an array of coderefs (references to subroutines) which is not at all what is needed here.

I personally believe that indeed map and its sibling grep are more magical: precisely because as I wrote in my reply to the OP they accept an expression to be evaluated for each of the other parameters. But I don't understand what you mean with "which is not at all what is needed here" because your example does exaclty what I mean: I do expect it to return a list (not an array!) of coderefs. Only, it probably does not do what you expect in that those coderefs are... all the same coderef:

C:\temp>perl -E "say for map sub {1 x $_} => 1..3" CODE(0x182a944) CODE(0x182a944) CODE(0x182a944)

This is because $_ is a package variable and those anonymous subs are not closures: when you will use one of them, its $_ will be that in scope at the moment, not the one passed to map() when it was created. To obtain that you have to close over a lexical:

C:\temp>perl -E "say for map { my $x=$_; sub {1 x $x} } 1..3" CODE(0x23aa7c) CODE(0x182aef4) CODE(0x182ad74)

Alternatively, and this is the interesting point to be noted here, Perl 5.10 and highter support lexical $_:

C:\temp>perl -E "my $_; say for map sub {1 x $_} => 1..3" CODE(0x23a97c) CODE(0x182a9bc) CODE(0x183bbbc)
--
If you can't understand the incipit, then please check the IPB Campaign.