in reply to Array Comparison

Your code does several things more than you describe. In addition to removing (case-insensitive) duplicates, it also has some other criteria for elimination, which should not be inside the foreach.

To duplicate your code functionally, we have to:

  1. Remove non-words (you missed a closing / in that pattern, by the way)
  2. Remove words shorter than 4 chars
  3. Remove words that appear more than once (your technique suggests that the list is sorted)
  4. Remove words that appear in @exclude
Ok, here we go!
# given @words and @exclude my %seen; @seen{@exclude} = (1) x @exclude; @words = grep { (! /\W/) and (length() >= 4) and ($seen{$_}++ == 0) } @words;
We pre-load %seen with a flag for each word in @exclude. Then, as we're looking through @words itself, we mark each element as seen as well.

The PerlMonk tr/// Advocate

Replies are listed 'Best First'.
Re: Re: Array Comparison
by mcogan1966 (Monk) on Dec 22, 2003 at 19:16 UTC
    Very nice. Does exactly what I need, and quickly too. Only thing left for this is to make the comparison non-case-dependent and it's perfect. I'll play around with this a touch. Thanks a bunch.

    Got it by making the arrays all lower-case when they are set up. Nice and quick.