[Israel.pm] bitten by context

Gabor Szabo gabor at szabgab.com
Tue Apr 24 05:05:04 PDT 2012


On Tue, Apr 24, 2012 at 2:54 PM, ynon perek <ynonperek at gmail.com> wrote:
> Hi Everyone,
> I was bitten today by this snippet that I still can't understand (second
> test fails):
>
> use v5.14;
> use Test::More;
>
> my @l = qw/red blue green/;
>
> my $has_red_1 =   grep /red/, @l;
> my $has_red_2 = ( grep /red/, @l ? 1 : 0 );
>
> is ( $has_red_1, 1, "Expected" );
> is ( $has_red_2, 1, "This one fails - Why ?" );
>
> done_testing;
>
> I know that grep does nothing in void context, but here I have a valid
> boolean context - what's going on ?

save the script in a.pl then run:

perl -MO=Deparse,-p a.pl


sub BEGIN {
    require(v5.14);
}
use Test::More;
use strict 'refs';
BEGIN {
    $^H{'feature_unicode'} = q(1);
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
(my(@l) = ('red', 'blue', 'green'));
(my $has_red_1 = grep(/red/, @l));
(my $has_red_2 = grep(/red/, (@l ? 1 : 0)));
is($has_red_1, 1, 'Expected');
is($has_red_2, 1, 'This one fails - Why ?');
done_testing();
a.pl syntax OK




More information about the Perl mailing list