2013-10-10 23 views
0

我在Perl中很新,所以請試着理解我。 我有一個.txt文件中定義了一些行是這樣的:使用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

答案是在40行 –

+0

是的,但請告訴我更多,我不知道該看什麼。謝謝 – ion

+0

我想告訴你,但不知道第40行的內容是什麼 –

回答

1

你可能需要從文件句柄讀取文件名後刪除換行符:

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

或更常見,

while (my $line = <F>) { 
    chomp($line); 
    $sftp->get($line, $line); 
} 
+0

很好,謝謝。 – ion

+0

我還想問一件事。 當我在遠程sftp服務器上創建ls,並在我的.txt文件中輸入ls時,我得到了這個結果。 '。 doc1.20131010.zip .. doc3.20131010.zip doc3.20131010.zip doc4.20131010.zip' 我怎麼知道腳本忽略第一個點,然後第三兩個點? 謝謝。 – ion

+0

''ls -A''也列出所有沒有暗示的'''''和''''。 –

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在文件末尾。

相反,你使用:

​​

其打印的文件出來,但由於文件名有NL,它看起來很好。否則,你會看到額外的空間,並立即看到問題。

+0

謝謝,我修正了你說的代碼。很棒! 現在我需要找到一種方法來忽略這些點或者根本沒有列出它們。 – ion

相關問題