Beefy Boxes and Bandwidth Generously Provided by pair Networks DiBona
There's more than one way to do things
 
PerlMonks  

Re: Problems with map(function, array)

by LanX (Abbot)
on Dec 10, 2012 at 21:21 UTC ( #1008164=note: print w/ replies, xml ) Need Help??


in reply to Problems with map(function, array)

works for me:

DB<121> sub add { $_ + $_[0] } DB<122> map add(2), 1..3 => (3, 4, 5)

> Surprisingly, my new function sometimes works, and sometimes not. Here's the output from that second code fragment:

No surprise, you're deleting @a in the process, please repeat your experiments always with freshly reinitialized input.

Cheers Rolf


Comment on Re: Problems with map(function, array)
Download Code
Re^2: Problems with map(function, array)
by Redei (Initiate) on Dec 10, 2012 at 21:26 UTC
    My problem is what happens when I don't use $_:
    sub twice { 2 * $_[0] } @a = map twice, 1..3; print "@a\n"; ==> 0 0 0
      the LIST elements are ALWAYS passed via $_ per iteration.

      you call twice w/o parameters so $_[0] is undef and undef*2 == 0!

      take again a look at my "add"-example to distiguish between parameters and iteration value

      Cheers Rolf

      Your original code with strict and warnings:

      use strict; use warnings; sub twice { 2 * $_[0] } my @a = map twice, 1..3; print "@a\n";
      gives the warning "Use of uninitialized value $_[0] in multiplication (*) at map1.pl line 3".

      This is how it should be written:

      use strict; use warnings; sub twice { 2 * $_[0] } my @a = map twice($_), 1..3; print "@a\n";
      which produces 2 4 6 as expected.

      BTW, Conway, in Perl Best Practices, chapter 8, recommends always using the block form of map, not the expression form that you are using. The expression form might be faster than the block form though (if that matters, you should benchmark it).

        Thank you for the suggestions. I should have been using strict and warnings, of course. Maybe then I would have seen more easily where my problem was.

        I don't have Conway's book, so I can't see in what context he recommends using the block (rather than the expression) form of map. But I do have reasons for wanting the expression form:

        • It's legal syntax, so it should be useable. (And it is, of course, if you don't make the kind of mistake I did.)
        • It's more elegant for a single-parameter function. At least I think so.

Re^2: Problems with map(function, array)
by Redei (Initiate) on Dec 10, 2012 at 21:30 UTC
    You're right when you say I should have used freshly reinitialised input. But where does map destroy the input array?

    EDIT: Okay, I've got it now. Thanks for your help.
      The array is not exactly deleted, but the elements are reduced to empty strings:

      DB<139> sub my_uc { my $c = shift; return uc($c); } DB<140> my_uc() DB<141> @a = map my_uc, a..c => ("", "", "")

      keep in mind no argument means $c is undef!

      Cheers Rolf

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (6)
As of 2014-04-21 02:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (489 votes), past polls