Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^2: Failed array attemp

by Anonymous Monk
on May 13, 2012 at 21:31 UTC ( #970338=note: print w/ replies, xml ) Need Help??


in reply to Re: Failed array attemp
in thread Failed array attemp

Thanks for that.If I should not really do it this way what would be a best and shortest method?


Comment on Re^2: Failed array attemp
Re^3: Failed array attemp
by stevieb (Hermit) on May 13, 2012 at 21:44 UTC
    for my $elem ( @a ){ push @z, $_ = ( first { $elem eq $_ } @b ) ? '+' : '-'; }
      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.

        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
Node Status?
node history
Node Type: note [id://970338]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (12)
As of 2014-11-21 16:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (114 votes), past polls