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