Однако я получаю сообщение об ошибке «Невозможно разобрать дату».
Вы получаете сообщение об ошибке из-за строки:
$trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/;
Сценарий ожидает, что всефайлы в каталоге с расширением .out
имеют правильные метки времени в начале своих имен.И в строке скрипта отсутствует обработка ошибок.
Попробуйте добавить здесь некоторую проверку, например:
unless($trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/) {
warn "WRN: Malformed file name: $trace\n";
next;
}
Это проверяет, совпадает ли имя файла, и если нет, то предупреждениебудет напечатан и будет пропущен.
В качестве альтернативы вы также можете добавить проверку в строку grep {} readdir()
:
@traces = grep { /.out$/ && /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/ && -d "$dir/$_" } readdir(DIR);
, чтобы отфильтровать неуместные .out
файлы (хм, на самом делекаталоги), прежде чем они достигнут цикла, который вызывает функцию ParseDate
.