sub unique (@) { my ($arr) = shift; my %x; for my $index (0 .. $#$arr) { my $val = $arr->[$index]; !defined($val) && do { $x{__NOT_DEFINED__} ||= [ $index, undef, ]; next; }; $x{$val} ||= [ $index, $val, ]; } map { $_->[1] } sort { $a->[0] <=> $b->[0] } values %x; }