我是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.
答案 0 :(得分:1)
从文件句柄中读取文件名后,您可能需要删除换行符:
for my $line (<F>) {
chomp($line);
$sftp->get($line, $line);
}
或更常见的是,
while (my $line = <F>) {
chomp($line);
$sftp->get($line, $line);
}
答案 1 :(得分: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,看起来很好。否则,你会看到额外的空间并立即看到问题。