in reply to removing elements from an array containing duplicated patterns

Another way to do it:

#!/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;

Edit: Or another way...

#!/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; /($re)/ and $seen{$1}++ for (@data); my $unique = join "|", map quotemeta, grep { $seen{$_} == 1 } @pattern +s; my @unique = grep { /$unique/ } @data;

— Arien