in reply to Re^3: Failed array attemp
in thread Failed array attemp
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Failed array attemp
by stevieb (Canon) on May 14, 2012 at 00:49 UTC |