use strict;
use Data::Dumper;
chomp(my @files = <DATA>);
# find unique basenames
my @basenames = keys %{{ map { (split/\./)[0] => 1 } @files }};
# find unpaired files
foreach my $basename (@basenames) {
my @matches = grep (/$basename/, @files);
print "$matches[0]\n" if $#matches == 0;
}
No, this solution breaks if any filenames have regex-significant metachars, or are partially within a larger filename.
In my opinion, the original solution is actually the most direct,
as this is a classic set difference problem.