my ($i, %seen) = (0); my @no_dup = grep { -1 != ($seen{/(pattern)/} = exists $seen{$1} ? -1 : $i++) } @with_dup; @no_dup = @no_dup{grep $_ != -1, values %seen};