You may find File::Find helps clean up the logic:
use strict;
use warnings;
use File::Find;
my @matches = (qr(.*\.pl$), qr(.*\.pm$));
find(sub{wanted ($_, @matches)}, '.');
sub wanted {
my ($name, @m) = @_;
print "$File::Find::name\n" if grep {$name =~ /$_/} @m;
}
Prints (on my system - your results will be different):
./noname1.pl
./noname1.pm
./noname2.pl
./noname2.pm
./SortaIniParser.pm
./StarTrek.pl
./Win32/FileVersionInfo.pm
./Win32/PEFile.pm
You can replace the grep {$name =~ /$_/} @m test with whatever suits your purpose.
Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond