Я бы использовал
my ($date) = m{/([0-9]{2,8})(?:/|$)}
и проверил бы
not(length($date) % 2) # $date has even length
и, возможно, несколько проверок на допустимые комбинации.
Обновление: ОК, чтобы получить маску, а не цифры, вы можете изменить это значение на
my ($date) = m{/([YMD]{2,8})(?:/|$)};
my $check = $date;
$check =~ s/YYYY/y/;
$check =~ s/MM//;
$check =~ s/DD//;
print "Matches $date\n" if grep $_ eq $check, (q{}, 'y', 'YY');
Это должно исключить все недопустимые комбинации, такие какГГДГГГ или ГГГГММГГ и т. Д.