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


in reply to A more concise way to map the contents of an array.

you could use the conditional operator aka "ternary operator" :

my @cell_contents = map { $_ ? 1 : 0 } @$array_ref[3..10];

another idea is to use doubled negation "!!" and to map the empty string (false) to 0.

my @cell_contents = map { 0 + !!$_ } @$array_ref[3..10];

but I don't think this conciseness justifies the loss of readability.¹

Cheers Rolf

¹) well if you really need 0 for false.

Replies are listed 'Best First'.
Re^2: A more concise way to map the contents of an array.
by muba (Priest) on Dec 30, 2012 at 13:23 UTC

    I don't think it gets much more concise than that. However, yet another way to achieve the same would be

    @cell_contents = map { $_ and 1 or 0 } @$array_ref[3..10]
Re^2: A more concise way to map the contents of an array.
by Amblikai (Scribe) on Dec 30, 2012 at 13:43 UTC

    I like the first one you wrote, i hadn't come across that operator. Seems exactly the same as a conditional statement in Verilog. So it's still pretty readable to me!

    Regarding your footnote, supposing i didn't need 0 for false, how would i do it? And how else can you represent false?

    Thanks very much for your very helpful reply.

      > Regarding your footnote, supposing i didn't need 0 for false, how would i do it? And how else can you represent false?

      Just use the product of a doubled negation to get clear booleans!¹

      Perl's definition of false covers different data types and context cases.

      from perldata

      A scalar value is interpreted as TRUE in the Boolean sense if i +t is not the null string or the number 0 (or its string equivalent, "0") +. The Boolean context is just a special kind of scalar context where +no conversion to a string or a number is ever performed.

      (Null string here means either empty string "" or undef)

      from perlsyn

      Truth and Falsehood The number 0, the strings '0' and '', the empty list "()", and +"undef" are all false in a boolean context. All other values are true. Negation of a true value by "!" or "not" returns a special fals +e value. When evaluated as a string it is treated as '', but as a number +, it is treated as 0.

      Cheers Rolf

      ¹) in this case  my @cell_contents = map { !!$_ } @$array_ref[3..10];

      for me the most readable alternative!

        So just to be clear, if i double negate something, i'll lose the original "value" and be left with the pure boolean representation of the data? That could prove useful!

        Thanks again for your reply!