Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

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?



Replies are listed 'Best First'.
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


    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.


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://751458]
Approved by toolic
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (10)
As of 2018-06-21 22:33 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (120 votes). Check out past polls.