Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^4: Failed array attemp

by AnomalousMonk (Archbishop)
on May 13, 2012 at 22:36 UTC ( [id://970354]=note: print w/replies, xml ) Need Help??


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

    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!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://970354]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (3)
As of 2024-04-25 07:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found