Программист исправил модуль MkDir из предыдущей задачи,
и стал всюду проверять результат выполения mkdir
.
MkDir2.pm (файл скачивается):
package MkDir2;
use strict;
use warnings;
=head1 NAME
MkDir2 -- рекурсивное создание каталогов
=head1 SYNOPSIS
use MkDir2;
MkDir2::mkdir_recursive("test/a");
MkDir2::mkdir_recursive("/tmp/test/b");
=head1 DESCRIPTION
Модуль предоставляет функцию mkdir_recursive для рекурсивного создания каталогов.
Модуль предназначен для Unix-подобных систем с разделителем в именах каталогов "/" и корневым каталогом /.
=cut
sub _mkdir
{
mkdir $_[0] or die "can't create dir $_[0]: $!";
}
sub mkdir_recursive
{
my $path = shift or die;
my @parts = split "/", $path;
my $dir = shift @parts || "/";
_mkdir $dir;
for my $d (@parts){
$dir .= "/$d";
_mkdir $dir;
}
}
1;
Еще можно скачать пример использования.
Но проблем меньше не стало…
Прямо скажем, проблем стало гораздо больше.
По существу, теперь с помощью mkdir_recursive
не получается создать почти ничего.
Главная проблема – слишком дотошная проверка
значения, возвращаемого mkdir
.
mkdir
возвращает истину, если успешно создает
каталог. Иначе она возвращает ложь, в том числе
и в случае, если каталог уже существует до вызова.
Поэтому новая mkdir_recursive
падает, как только на очередном шаге
пытается создать каталог, который уже есть в файловой системе.
Фактически, единственный случай, когда она может отработать нормально
– это создание по-настоящему нового каталога,
заданного относительным путем.
Если путь абсолютный, то функция падает на первом же шаге, при попытке выполнить
mkdir /
(результатом чего, конечно, будет ложь, потому что каталог /
уже есть,
и сработает or die
).