#!/usr/bin/perl use strict; use warnings; my @array = (3,2,1,1,1,2,3,4,6,"",5,"","",9,"",""); my @clean_array = clean(@array); my @clean_ord_array = clean_ord(@array); print "\nclean_array:\n"; map { print "elem: $_\n"; } @clean_array; print "\nclean_ord_array:\n"; map { print "elem: $_\n"; } @clean_ord_array; # clean, don't preserve order sub clean { my @clean = @_; my @seen; my @cleaned; my %seen; my $i; for ( $i = 0 ; $i <= $#clean ; $i++ ) { unless ( ( defined $clean[$i] ) && ( $clean[$i] ne '' ) ) { splice @clean, $i, 1; } } @seen{@clean} = (); @cleaned = sort keys %seen; if (wantarray) { return @cleaned; } else { if ( defined($/) ) { return join "$/", @cleaned; } else { return join "\n", @cleaned; } } } # clean, preserve order sub clean_ord { my @clean = @_; my $clean; my @seen; my @cleaned; my %seen; my $i; for ( $i = 0 ; $i <= $#clean ; $i++ ) { unless ( ( defined $clean[$i] ) && ( $clean[$i] ne '' ) ) { splice @clean, $i, 1; } } foreach $clean (@clean) { unless ( exists $seen{$clean} ) { push ( @cleaned, $clean ); $seen{$clean} = 1; } } if (wantarray) { return @cleaned; } else { if ( defined($/) ) { return join "$/", @cleaned; } else { return join "\n", @cleaned; } } }