$sum = eval join ' + ', @addends; #### $all_true = eval join ' && ', @flags; #### sub AND { ! grep !$_, @_ } sub OR { !!grep $_, @_ } #### DB<1> p AND() 1 DB<2> p AND(0) DB<3> p AND(1) 1 DB<4> p AND(2, 3, 0, 1) DB<5> p OR() DB<6> p OR(1) 1 DB<7> p OR(2, 3, 0, 1) 1 #### use List::Util 'first'; sub AND { ! first { !$_ } @_ } sub OR { !!first { $_ } @_ } #### DB<1> p OR(0) DB<2> p OR() DB<3> p OR(1) 1 DB<4> p OR(undef, 2, 0, 'x') 1 #### DB<1> p AND(0) 1 DB<2> p AND() 1 DB<3> p AND(1) 1 DB<4> p AND(undef, 2, 0, 'x') 1 #### sub AND { $_ || return 0 for @_; 1 } sub OR { $_ && return 1 for @_; 0 } __END__ DB<1> p AND(0) 0 DB<2> p AND() 1 DB<3> p AND(1) 1 DB<4> p AND(undef, 2, 0, 'x') 0 DB<5> p OR(0) 0 DB<6> p OR() 0 DB<7> p OR(1) 1 DB<8> p OR(undef, 2, 0, 'x') 1 #### use List::Util 'reduce'; sub add { reduce { $a + $b } ( 0, @_ ) } sub mult { reduce { $a * $b } ( 1, @_ ) }