#!/usr/bin/perl use strict; use warnings; my @data = ( '$?/1dlw&', '*%1sdh^?', '@/!1dlw\\/', '$£1cgi*&', '?@1sdh%&', '~#1xnf$%' ); my @patterns = qw/1dlw 1sdh 1cgi 1xnf/; my $re = join "|", map quotemeta, @patterns; my %seen; for (@data) { next unless /($re)/; # shouldn't happen, presumably if (defined $seen{$1}) { push @{ $seen{$1} }, $_; } else { $seen{$1} = [ $_ ]; } } my @unique = map { @{ $seen{$_} } == 1 ? $seen{$_}->[0] : () } keys %seen;