使用perl获取.txt文件,并为该文件中的每一行做一些事情

时间:2013-10-10 12:39:45

标签: linux perl

我是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.

2 个答案:

答案 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代替saysay的全部目的是防止可能导致错误的问题。

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

如果您同时执行了这两项操作,您会发现$sftp->get($line, $line)失败了,因为您忘记了chomp文件末尾的NL。

相反,您使用了:

 `print $line;`

打印出文件,但由于文件名有NL,看起来很好。否则,你会看到额外的空间并立即看到问题。