Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Matching array elements not in another array

by loris (Hermit)
on Mar 18, 2009 at 14:48 UTC ( #751458=perlquestion: print w/ replies, xml ) Need Help??
loris has asked for the wisdom of the Perl Monks concerning the following question:

Dear All,

I have an array of available things, an array of requested things and want to find which requested things are not available. I would like to do something like:

my @available_things = qw/ant bat cat dog /; my @requested_things = qw/bat rat/; my @not_available_requested_things = map {grep(!/$_/,@available_things)} @requested_things; print "available: @available_things\n"; print "requested: @requested_things\n"; print "requested, not available: @not_available_requested_things\n";

but this does not give me what I want (rat).

Can anyone enlighten me?

Thanks,

loris

Comment on Matching array elements not in another array
Download Code
Re: Matching array elements not in another array
by Corion (Pope) on Mar 18, 2009 at 14:56 UTC

    This is a FAQ. See perlfaq4 or perldoc -q intersection for how to find the intersection of two arrays.

Re: Matching array elements not in another array
by jethro (Monsignor) on Mar 18, 2009 at 15:05 UTC

    A better structure for the type of search you want is a hash

    After

    my %available_things= map { $_,1} @available_things;

    your search is a simple lookup:

    @not_available_requested_things = map { $_ if not $available_things{$_ +} } @requested_things;
Re: Matching array elements not in another array
by eff_i_g (Curate) on Mar 18, 2009 at 16:16 UTC
    use strict; use warnings; use List::Compare; my @available_things = qw/ant bat cat dog /; my @requested_things = qw/bat rat/; my $lc = List::Compare->new(\@available_things, \@requested_things); print $lc->get_complement(), "\n";

      “I'll second this motion.” Here's why...

      It is a very instinctive thing, for a programmer, to look at a problem and to immediately consider how he would solve it. (And even, to consider it and then struggle with it for a little while and then post the question to PerlMonks.)

      It is not so instinctive to stop and ask oneself: “hasn't this already been done by someone else?”

      And so you overlook things like List::Compare, and List::AllUtils, simply because it never occurred to you to look for them.

      Mind you, I do it too! We all do. Schools teach you that “everything you do must be your own work,” and they stick you in semester-long classes where you monkey-around with manual manipulation of data structures, in various inexcusable languages. Before that, generations of programmers worked in an environment where “an instantaneous and vast online code resource” did not exist ... the closest thing we ever had were SHARE tapes.

      When you leverage existing code like this, it's not only quite-a-bit more descriptive of what your code is actually doing, but it pushes the “how” aspect out-of-sight out-of-mind. Your code simply posits that an existing block of tested code to do this thing already exists, and uses that code to do it. While it could be debated, endlessly of course, whether such a herculean travesty is or is not “efficient” for the computer, it sure is efficient for you.

        This a good point and I shall look at the modules you suggested. However, performing fairly simple operations with lists is something I expect Perl to be good at, so I expected there to be some simple solution which does not require extra modules. As jethro shows, there is one.

        loris

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://751458]
Approved by toolic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2014-09-20 18:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (160 votes), past polls