On Oct 30, Robert Thompson said:

>       Another question though, is there a simple way to uniq an array,
>ie search through it and removing all duplicates? Up until now I have
>been making a clumsy subroutine to do this, but I am wondering if there
>is something more simple that will handle this.

That's a very common question -- as such, it can be found in the
FAQ.  There are many ways to approach this problem.  If you want to keep
your elements in the same order, a grep() will work for you:

  {
    my %seen;
    @uniq = grep !$seen{$_}++, @orig;
  }

Let's break this down into a for loop:

  for (@orig) {
    if (!$seen{$_}++) {
      push @uniq, $_;
    }
  }

The only tricky part of this code is the !$seen{$_}++.  What is it
doing?  Well, first, it checks to see if $seen{$_} is false (that's the
!$seen{$_} part).  If it IS false, the if block is executed.  If it's not
false, there's no else block.

What does $seen{$_} being false indicate?  Well, we've given the hash a
rather apropos name, "seen".  This hash indicates whether or not we've
seen this array element before.  That's where the ++ part comes in.  If ++
comes AFTER a variable, the incrementing is done AFTER the value of the
variable is returned:

  $x = 10;
  $y = $x++;
  # $x is 11, $y is 10

So let's look at the if statement again:

  if (! $seen{$_}++) { ... }

First, $seen{$_} is tested for falsehood.  AFTER THAT TEST RETURNS,
$seen{$_} is then incremented.  Let's make a table of what happens to
$seen{$_} for some $_:

  $seen{foo}  !$seen{foo}  after $seen{foo}++
  0           1            1
  1           0            2
  2           0            3
  :           0            :

So what happens is, if we haven't seen a specific element before, we add
it to the array.  Otherwise, we do nothing, and either way, we make a note
that we've seen the element.  All that is expressed in the rather compact
code:

  @uniq = grep !$seen{$_}++, @orig;

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to