for my $elem ( @a ){
push @z, $_ = ( first { $elem eq $_ } @b ) ? '+' : '-';
}
One problem with this code is that first returns the first element from @a that is also present in @b. If there is a 0 in both @a and @b a 0 will be returned. Numeric 0 is false, which will cause the ternary to select the '-' character representing element not present.
In addition, the code needlessly assigns to the $_ scalar. In the example below, comment out the local $_; statement and see what happens to the $_ scalar.
IMHO, using any (as in the OPed code) is far better. The job can also be done with the map built-in rather than a for loop.
>perl -wMstrict -MData::Dump -le
"use List::Util qw(first);
use List::MoreUtils qw(any);
;;
my @a = (1, 2, 3, 4, 5);
my @b = (9, 8, 2, 1, 5);
my @z;
;;
$_ = 'foo';
{ local $_;
for my $elem ( @a ){
push @z, $_ = ( first { $elem eq $_ } @b ) ? '+' : '-';
}
}
print @z;
print qq{\$_ == '$_'};
;;;;
@z = ();
for my $elem (@a) {
push @z, (any { $_ == $elem } @b) ? '+' : '-';
}
print @z;
;;;;
@z = map { my $ae = $_; (any { $ae == $_ } @b) ? '+' : '-' } @a;
print @z;
"
++--+
$_ == 'foo'
++--+
++--+
Update: Another oops. In the first for-loop example above, the statement
push @z, ( first { $elem eq $_ } @b ) ? '+' : '-';
was intended to exactly duplicate the corresponding statement in the post to which I was responding. I took out the $_ = assignment to test something, then forgot to put it back. I have now put the assignment back; the output is the same, and removing the local $_; statement now will really change the output.