in reply to Fast way - get array elements > 4 chars

I want to know how to extract unique elements in the array

Do you mean that you only want to handle elements which appear only once in the array or that you want to handle all elements (but skip over duplicates)?

A solution for skipping over duplicates could be:

use strict; use warnings; use List::MoreUtils qw/uniq/; my @array = qw/Returns a new list by stripping duplicate values in LIS +T The order of elements in the returned list is the same as in LIST I +n scalar context returns the number of unique elements in LIST/; my @drop_duplicates = uniq grep {length > 4} @array; { local $, = "\n"; print @drop_duplicates;}
And to extract elements that appear only once:
use strict; use warnings; my @array = qw/Returns a new list by stripping duplicate values in LIS +T The order of elements in the returned list is the same as in LIST I +n scalar context returns the number of unique elements in LIST/; my %seen; my @only_once = grep {$seen{$_} == 1 } map {$seen{$_}++; $_} grep {len +gth > 4} @array; { local $, = "\n"; print @only_once;}
Update: added some code examples.

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

Replies are listed 'Best First'.
Re^2: Fast way - get array elements > 4 chars
by ikegami (Patriarch) on Mar 23, 2009 at 17:12 UTC

    Update: Nevermind, that was your intention. Sorry, I guess I didn't read your whole post.

    The latter doesn't work. You seem to be expecting lazy evaluation, but map processes the entire list before grep is called.

    $ perl -le'print grep { $seen{$_} == 1 } map { $seen{$_}++; $_ } qw( a + b a c );' bc

    Fix:

    grep { ++$seen{$_} == 1 } grep { !$seen{$_}++ }