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


in reply to Re^2: Problems with map(function, array)
in thread Problems with map(function, array)

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).

Replies are listed 'Best First'.
Re^4: Problems with map(function, array)
by Redei (Initiate) on Dec 12, 2012 at 13:58 UTC

    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.