Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^3: Generate the perl sequence 1, 11, 111, ....

by quester (Vicar)
on Oct 10, 2008 at 09:34 UTC ( #716402=note: print w/ replies, xml ) Need Help??


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

The odd-looking syntax

mysubroutine {block} @list;
is mentioned in perlsub. Look in the section on prototypes where it describes the "&" prototype character, particularly the sentence "An & requires an anonymous subroutine, which, if passed as the first argument, does not require the sub keyword or a subsequent comma" and also the examples "try", "catch", and "mygrep".
 
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.
 
Also, not all builtin functions have regular enough syntax to be expressed with a prototype at all. map is one of them:
perl -wle 'print prototype("CORE::map")'
prints
Use of uninitialized value in print at -e line 1.


Comment on Re^3: Generate the perl sequence 1, 11, 111, ....
Select or Download Code
Re^4: Generate the perl sequence 1, 11, 111, ....
by blazar (Canon) on Oct 11, 2008 at 10:10 UTC
    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.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (13)
As of 2015-07-01 15:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (6 votes), past polls