0

我是 perl 的新手,所以请试着理解我。我在 .txt 文件中定义了一些这样的行:

doc1.20131010.zip
doc2.20131010.zip
doc3.20131010.zip
doc4.20131010.zip

我做了这个代码:

#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use autodie;
use Net::SFTP::Attributes;
use Net::SFTP;
use constant {
    HOST            => "x.x.x.x",
    USER_NAME       => "sftptest",
    PASSWORD        => "**********",
    DEBUG           => "0",
};
my $REMOTE_DIR = "IN";
my $LOCAL_DIR  = "/home/rec";
my $sftp = Net::SFTP->new (
    HOST,
    timeout         => 240,
    user            => USER_NAME,
    password        => PASSWORD,
    autodie         => 1,
);

#
# Fetch Files
#
#my $res = $sftp->ls($REMOTE_DIR,sub { print $_[0]{longname}, "\n" });
#print "$res";
my $ls = $sftp->ls($REMOTE_DIR) 
    or die "ls failed: " . $sftp->error;
open my $fh, '>', '/home/rec/listing' or die "unable to create file: $!";
print $fh $_->{filename}, "\n" for @$ls;
close $fh;
open  F, "</home/docs/listing";
for my $line (<F>)
{
    #print "$line";
    $sftp->get("$line","$line") ;
}

现在,当我运行上面的代码时,它应该给我上面列出的文件,而不是我得到这个:

Couldn't stat remote file: No such file or directory at ./r.pl line 40.
4

2 回答 2

1

您使用use autodie;,但您拥有:

open my $fh, '>', '/home/rec/listing' or die "unable to create file: $!";

不需要,or die...因为程序会自动死掉。

你也有use feature qw(say);,但你使用print而不是say. 的全部目的say是防止可能导致错误的问题。

您还应该检查您的$sftp->get($line, $line);线路的返回结果,看看它是否成功。

如果你同时做了这两个,你会看到你$sftp->get($line, $line)失败了,因为你忘记chomp了文件末尾的那个 NL。

相反,您使用了:

 `print $line;`

它将文件打印出来,但由于文件名有 NL,所以看起来不错。否则,您会看到额外的空间并立即发现问题。

于 2013-10-10T13:06:51.770 回答
1

从文件句柄读取文件名后,您可能需要删除换行符:

for my $line (<F>) {
  chomp($line);
  $sftp->get($line, $line);
}

或更常见的是,

while (my $line = <F>) {
  chomp($line);
  $sftp->get($line, $line);
}
于 2013-10-10T12:50:18.400 回答