> -----Original Message-----
> From: Jackson, Harry [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, May 15, 2002 12:23 PM
> To: [EMAIL PROTECTED]
> Subject: Optimising for fun/speed not good code was Unique Lists
>
>
> Hi
>
> sub harryGrep {
> return [ grep { not $\{$_}++ } @_ ];
> }
>
>
> It took me quite a while to find something quicker than the
> original grep
> using the function I first tried and then I happened across a
> piece of text
> talking about return contexts and tried the above. I also
> noticed a little
> bit of code from Drieux's page's and tried this and knocked
> nearly 0.5s off
> it again
>
> sub unique{foreach (@_) { $_{$_}++} [keys %_]}
>
> sub GrepMe { [ grep { ! $/{$_}++} @_ ]}
>
> I did not know you could drop the return until I seen Drieux
> do it. Another
> method that is quicker than my foreach attempt is the following.
>
> sub unique{ map { $_{$_} = 1 } @_; [keys %_] }
>
> I would like to have been able to do something like the
> following but it
> does not work?
>
>
> sub unique{ [ keys {map { $_{$_} = 1 } @_ }] }
^^^^^^^^^^^^^^^^^^^^^^
This returns a list of the results of the block { $_{$_} = 1 }
as evaluated for each value in @_.
But the value of the expression $_{$_} = 1 is always 1, to
your map() is returning a list of 1's. This is obviously
not suitable for converting to a hash to pass to keys().
You probably want:
map { ($_ => 1) } @_;
This creates a list of (key, 1) pairs for each element in @_.
So if @_ contains 'foo','bar','baz', the map output list
will be:
'foo', 1, 'bar', 1, 'baz', 1
Now, you can create a ref to an anonymous hash out of that
list by:
{map {($_ => 1)} @_}
To dereference that to a hash to pass to keys(), you would use:
%{{map {($_ => 1)} @_}}
Now the final sub is:
sub unique { keys %{{map {($_ => 1)} @_}} }
(I removed the square brackets to return a list instead of an
array ref. Your choice.)
>
> I think the BLOCK {map { $_{$_} = 1 } @_ } returns a
> reference and it will
> need to be de-referenced for keys to work but I cannot figure
> it out any
> ideas anyone.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]