#!/usr/bin/perl -w
use strict;
use constant NL => qq[\n]; # a less ugly new line

my(@list) = qw/ 1 2 3 a b c do re mi so you see rm -v one 3 b A mi si -v /;

print join(' ', &remove_dups_fast( @list ));
print NL x 2;
print join(' ', &remove_dups_ordered( @list ));
print NL x 2;

# faster method, if original order of the list doesn't matter
sub remove_dups_fast { my(%clean) = (); @clean{ @_ } = (); sort keys %clean }

# slightly slower method that preserves the original order of the list
sub remove_dups_ordered {

   my(@raw) = @_;
   my(@clean,%lookup) = ();

   @lookup{ @raw } = @raw;

   foreach (@raw) {

      my($item) = delete $lookup{$_};

      push(@clean, $item) if defined $item;
   }

   return @clean
}