for my $elem ( @a ){
push @z, $_ = ( first { $elem eq $_ } @b ) ? '+' : '-';
}
| [reply] [d/l] |
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.
| [reply] [d/l] [select] |
Thank you for pointing out the difference between any() and first(). Certainly something I'll remember :)
I've put an update in my first response to the OP pointing to your post without changing my code. The post you responded I'm leaving exactly how it is as to not distort your fine examples.
Also, I swore I tried my code without the extra assignment to $_, but I must have had something else wrong and changed two things at once (including the '$_ =') in an attempt to fix it. I know better than to change too much, but I digress :) Cheers!
| [reply] |