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);を使用します。の全体的な目的は、エラーの原因となる可能性のある問題を防ぐことです。printsaysay

また、行の戻り結果をチェックして、$sftp->get($line, $line);成功したかどうかを確認する必要があります。

これらの両方を行った場合、ファイルの最後にある NL$sftp->get($line, $line)を忘れたため、失敗していることがわかります。chomp

代わりに、次を使用しました。

 `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 に答える