#perl
#perl
Вопрос:
Я разработал программу для восстановления файлов из удаленной папки sftp, и она работала нормально.
И теперь у меня странная проблема с этой программой. Пожалуйста, найдите ниже фрагмент кода, с которым у меня возникла эта проблема:
my @ls = $sftp->ls("$config->[$i]->{'SOURCE'}") or do {
$logger->error("Could not retrieve directory listing, exiting from processing");
next;
};
выполняется оператор or для $ sftp-> ls, который ожидается только при сбое $ sftp-> ls. Но у меня нет никаких проблем при доступе к нему вручную. Код состояния, который я получил после инструкции $ sftp-> ls, равен 0, что означает «Успешно».
Я не уверен, почему он по-прежнему перенаправляется на фрагмент or, пожалуйста, сообщите. Также нет проблем, когда удаленная папка не пуста.
Используется SFTP:
use Net::SFTP::Foreign::Compat ':supplant';
Ответ №1:
Ваше заявление my @ls = ... or ...
проверяет результат =
оператора. Поскольку его LHS является массивом, это назначение списка. Назначение списка в скалярном контексте возвращает количество элементов в RHS. Другими словами, если был возвращен непустой список, все в порядке; пустой список рассматривается как ошибка.
Вы не сказали нам, что $sftp
это такое. Я предполагаю, что это объект Net::SFTP.
Согласно документации, $sftp->ls
возвращает список записей каталога. Поэтому ваш код обрабатывает пустой каталог как ошибку. Вы также не сказали этого явно, но вы сказали «нет проблем, когда удаленная папка не пуста«, подразумевая, что есть проблема с пустыми каталогами.
Проблема (насколько я могу судить) связана с вашим кодом. Он делает именно то, что вы ему сказали.
Обновление: я просмотрел исходный код. Это не задокументировано, но вы можете проверить наличие ошибок отдельно, вызвав метод в скалярном контексте:
my @ls = do {
my $ls_ref = $sftp->ls($config->[$i]{SOURCE}) or do {
$logger->error("Could not retrieve directory listing, exiting from processing");
next;
};
@$ls_ref
};
В скалярном контексте ls
возвращает либо ссылку на массив результатов, либо undef
при сбое.
Комментарии:
1. Я ценю вашу поддержку. Я использовал Net ::SFTP :: Foreign::Compat ‘: replant’;
2.
Net::SFTP::Foreign::Compat
не поддерживает недокументированную вещь »ls
в скалярном контексте». Вам придется проверятьerror
вручную .