http://www.perlmonks.org?node_id=105635


in reply to creating unique list from elements in an array

The word unique nearly always call for a hash to be used. The solutiom is to extract the names, then to use them as (unique) keys to a hash.

#!/bin/perl -w use strict; my %unique_names; # this is the hash while( <DATA>) { my @values= split /\|/; # extract the fields (don't + forget to backslash the |) my @names= split /,\s*/, $values[2]; # extract the names foreach my $name (@names) { $unique_names{$name}++; } # we don't really care abou +t the value, just the key } my @unique_names= keys %unique_names; # put the names back into a +n array print join "-", @unique_names; print "\n"; __DATA__ value 1|value 2|tom, chris, dave|value 4 value 1|value 2|peter, tom, dave|value 4

Replies are listed 'Best First'.
Re: Re: creating unique list from elements in an array
by Hofmator (Curate) on Aug 17, 2001 at 13:44 UTC

    Very nice, mirod++, a good explanation! I just add the compact version - which is also a bit more efficient because it uses a hash slice:

    my %unique; @unique{ split /,\s*/, ( split /\|/ )[2] } = () while (<DATA>); my @unique_names = keys %unique; print join "-", @unique_names; print "\n"; __DATA__ value 1|value 2|tom, chris, dave|value 4 value 1|value 2|peter, tom, dave|value 4

    -- Hofmator