4.7. Finding Elements in One Array but Not AnotherProblemYou want to find elements that are in one array but not another. Solution
You want to find elements in Straightforward implementation# assume @A and @B are already loaded %seen = (); # lookup table to test membership of B @aonly = (); # answer # build lookup table foreach $item (@B) { $seen{$item} = 1 } # find only elements in @A and not in @B foreach $item (@A) { unless ($seen{$item}) { # it's not in %seen, so add to @aonly push(@aonly, $item); } } More idiomatic versionmy %seen; # lookup table my @aonly;# answer # build lookup table @seen{@B} = (); foreach $item (@A) { push(@aonly, $item) unless exists $seen{$item}; } Discussion
As with nearly any problem in Perl that asks whether a scalar is in one list or another, this one uses a hash. First, process
The given code retains duplicate elements in foreach $item (@A) { push(@aonly, $item) unless $seen{$item}; $seen{$item} = 1; # mark as seen }
The two solutions differ mainly in how they build the hash. The first iterates through $hash{"key1"} = 1; $hash{"key2"} = 2; is equivalent to: @hash{"key1", "key2"} = (1,2);
The list in the curly braces holds the keys; the list on the right holds the values. We initialize @seen{@B} = ();
This uses items in @seen{@B} = (1) x @B; See AlsoHash slices are explained in perldata (1) and the "Variables" section of Chapter 2 of Programming Perl ; Chapter 5 ; we use hashes in a similar fashion in Recipe 4.6 and Recipe 4.8
Copyright © 2002 O'Reilly & Associates. All rights reserved. |
|