From: drieux <[EMAIL PROTECTED]>
> On Monday, April 22, 2002, at 09:29 , David Gray wrote:
> 
> >> Can anyone tell me the best method for removing duplicate
> >> array values.
> >>
> >> eg:
> >>
> >>  @array = qw( a a a b b b c);
> >>
> >> becomes after some operation I cant seem to figure:
> >>
> >> @new_array_or_same = (a b c);
> >
> > In this situation, I usually use a hash instead of an array so I can
> > create highly useful statistics of how often each value occurs.
> 
> good reason to not use an autonomous hash.....
> 
> 
> what I just learned would solve the problem would be
> 
>  my @array = qw( a a a b b b c);
>  my @new_array = keys %{{ map { $_ => 1 } @array}};
> 
> since the perldoc -q uniq that jeff provided pokes in
> that direction - but was 'hash' oriented.....

Yes you can do that. But it's slow ...

        my @array = qw( a a a b b b c);
        my @new_array;
        { my %h; @h{@array} = (); @new_array = keys %h; }

using a named lexical hash and hash slice instead of map is 
quicker:

Benchmark: timing 20000 iterations of Faq, Mine...
       Faq: 10 wallclock secs ( 9.62 usr +  0.00 sys =  9.62 CPU) 
                @ 2078.35/s (n=20000)
      Mine:  1 wallclock secs ( 1.57 usr +  0.00 sys =  1.57 CPU)
                @ 12722.65/s (n=20000)

        #!perl
        use Benchmark;
        
        @array = ((qw( a a a b b b c d d d f f u u u u u i i a y s e t x)) x 10);
        
        sub Mine {
                my @new_array;
                { my %h; @h{@array} = (); @new_array = keys %h; }
                return scalar(@new_array);
        }
        
        sub Faq {
                my @new_array = keys %{{ map { $_ => 1 } @array}};
                return scalar(@new_array);
        }
        
        timethese 20000, {
                Mine => \&Mine,
                Faq => \&Faq,
        };
        __END__

> and, ok, so I am working out the questions:
> 
>  So why Exactly do I want to have 'map' to begin with?


        map { $_ => 1 } @array
creates a list in form:

        ( $array[0] => 1, $array[1] => 1, $array[2] => 1, ...)

If you then create a hash out of this list, the $array[x] items 
become keys and the 1s become values. 

So 
1.      map { $_ => 1 } @array
        creates list of keys and values
2.      {map { $_ => 1 } @array}
        creates a reference to an anonymous hash
3.      %{{map { $_ => 1 } @array}}
        dereferences the reference
4.      keys %{{map { $_ => 1 } @array}}
        returns a list of keys.

Jenda

=========== [EMAIL PROTECTED] == http://Jenda.Krynicky.cz ==========
There is a reason for living. There must be. I've seen it somewhere.
It's just that in the mess on my table ... and in my brain
I can't find it.
                                        --- me

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

Reply via email to