Нельзя использовать -e
для частичных совпадений имен файлов.
use File::Basename;
use File::Slurp;
my ($name, $path) = basename('/d1/d2/d3/abcd_');
my $exists = grep { /^\Q$name\E_[0-9]{5}_[0-9]{5}\.dat\z/ } read_dir $path;
Если каталог содержит много файлов, вы все равно можете поддерживать постоянный размер своей программы, используя opendir и readdir в цикле while.
Я использовал File::Slurp::read_dir
здесь, чтобы представить незагроможденное решение.