Я не думаю, что есть стандартная функция, которая может делать все, что вы просите, прямо из имени файла.
Но mkpath () из модуля File :: Path может почти сделать это, учитывая каталог имени файла. Из документа File :: Path:
Функция "mkpath" обеспечивает
удобный способ создания каталогов,
даже если ваш вызов ядра "mkdir" не будет
создать более одного уровня
каталог за раз.
Обратите внимание, что mkpath () не сообщает об ошибках в хорошем смысле: по какой-то причине он умирает, а не просто возвращает ноль.
Учитывая все это, вы можете сделать что-то вроде:
use File::Basename;
use File::Path;
my $fname = "/home/bob/test/foo.txt";
eval {
local $SIG{'__DIE__'}; # ignore user-defined die handlers
mkpath(dirname($fname));
};
my $fh;
if ($@) {
print STDERR "Error creating dir: $@";
} elsif (!open($fh, ">", $fname)) {
print STDERR "Error creating file: $!\n";
}