我设计了一个从远程sftp文件夹中检索文件的程序,它运行正常。
现在我对这个程序有一个奇怪的问题。请在下面找到我遇到此问题的代码片段:
my @ls = $sftp->ls("$config->[$i]->{'SOURCE'}") or do {
$logger->error("Could not retrieve directory listing, exiting from processing");
next;
};
$ sftp-> ls的或语句正在执行,仅在$ sftp-> ls失败时才会显示。但我手动访问时没有任何问题。我在$ sftp-> ls语句后收到的状态代码是 0 ,这意味着成功。
我不确定为什么它仍会重定向到或片段,请提供建议。当远程文件夹不为空时也没有问题。
使用SFTP:
use Net::SFTP::Foreign::Compat ':supplant';
答案 0 :(得分:2)
您的语句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
。