in reply to Re: if block inside map
in thread if block inside map

Just to elaborate a little.  You can also leave off the else branch, in which case map would return the empty string (not sure why not undef) when the if-condition isn't true:

my @x = map { if ($_ > 0) { $_*2 } } (-2 .. 2); use Data::Dumper; print Dumper \@x; __END__ $VAR1 = [ '', '', '', 2, 4 ];

When you don't want to return anything in those cases, you can use the empty list ():

my @x = map { if ($_ > 0) { $_*2 } else { () } } (-2 .. 2); # or: my @x = map { $_ > 0 ? $_*2 : () } (-2 .. 2); use Data::Dumper; print Dumper \@x; __END__ $VAR1 = [ 2, 4 ];

Replies are listed 'Best First'.
Re^3: if block inside map
by AnomalousMonk (Archbishop) on Nov 11, 2011 at 21:14 UTC

      Thanks for the pointer.  I must admit that thread somehow happened to sneak out from under my radar :)

      Personally, I would consider it more "natural" if an if-construct without an else clause (when used in an "expression context") would sematically behave more like a ternary cond ? ... : undef (instead of cond ? ... : cond), but if you look at it from the perspective of what is evaluated last, it's of course perfectly clear why things behave as they do.

      (Yes, I'm aware that if-constructs in Perl - unlike in some other languages - don't evaluate to anything itself (as a whole), i.e. they are not expressions — so no need to comment on that.)