Все задачи

Созидательный труд-2

09 Sep 2013

Программист исправил модуль 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;

Еще можно скачать пример использования.

Но проблем меньше не стало…

Подсказка

Показать

Прямо скажем, проблем стало гораздо больше.

Подсказка-2

Показать

По существу, теперь с помощью mkdir_recursive не получается создать почти ничего.

Разоблачение

Показать

Главная проблема – слишком дотошная проверка значения, возвращаемого mkdir.

mkdir возвращает истину, если успешно создает каталог. Иначе она возвращает ложь, в том числе и в случае, если каталог уже существует до вызова. Поэтому новая mkdir_recursive падает, как только на очередном шаге пытается создать каталог, который уже есть в файловой системе.

Фактически, единственный случай, когда она может отработать нормально – это создание по-настоящему нового каталога, заданного относительным путем. Если путь абсолютный, то функция падает на первом же шаге, при попытке выполнить mkdir / (результатом чего, конечно, будет ложь, потому что каталог / уже есть, и сработает or die).