Wednesday, July 8, 2009

Условное включение элементов в список в Perl

Оригинальный способ включения элементов в список на основе некоторых условий:
my @list = (
($element1) x !!$condition1,
($element2) x !!$condition2,
($element3) x !!$condition3,
);

Очень даже лаконично. Однако надо учитывать, что значение, например, $element1 вычисляется в любом случае (даже если $condition1 дает FALSE).
Еще один зачОтный пример, перекликающийся с первым, - альтернатива тернарному "?:" :
$a = $ok ? $b : $c;
$a = ($c, $b)[!!$ok];

3 comments:

  1. А разве не undef на месте невыполненных условий встанет?

    ReplyDelete
  2. !!$expr в контексте числа всегда будет 1 или 0.
    Частичное объяснение этого есть в man perlsyn:
    Negation of a true value by "!" or "not" returns a special false value.
    When evaluated as a string it is treated as '', but as a number, it is
    treated as 0.
    А про то, что !0 дает 1 нифига не написано :-)

    ReplyDelete