Perl程序的SFTP文件夹访问问题

时间:2016-10-18 09:38:17

标签: perl

我设计了一个从远程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';

1 个答案:

答案 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