2014-09-25 76 views
1

我有以下代碼:無限循環通過FTP讀取文件用Perl

use strict; 
use warnings; 
use Net::FTP; 

my $counter; 

my $ftp = Net::FTP->new("ftp.metagenomics.anl.gov", Debug => 0) 
    or die "Cannot connect.\n"; 
$ftp->login() or die "Login problems.\n"; 
$ftp->cwd("/projects") or die "Cannot change directory.\n"; 

for my $directory ($ftp->ls) { 
    $ftp->cwd($directory); 
    my ($remote_file_content, $remote_file_handle); 
    open($remote_file_handle, ">", \$remote_file_content); 
    $ftp->get("metadata.project-" . $directory . ".json", $remote_file_handle) 
     or die "Get failed.\n"; 
    while (my $line = $remote_file_content) { 
     $counter++; 
     if ($line =~ /"biome":{"unit":"","required":"1","value":"([A-Za-z0-9_\-. ]*)",/) { 
      print $counter. "\t" . $directory . "\t" . $1 . "\n"; 
     } 
    } 
    close $remote_file_content; 
    $ftp->cwd(".."); 
} 

然而,第一個文件被讀一遍又一遍......它就像一個無限循環,我不知道爲什麼它永遠不會完成讀取同一個文件。你有什麼主意嗎?

+1

您是否嘗試過註釋某些代碼行以查看問題所在?如果您發現哪條線路導致問題,您是否做過任何閱讀以查看**爲什麼**可能導致無限循環? – 2014-09-25 10:50:02

+0

跟蹤您的各種文件名,從'ls'打印出列表,打開哪個目錄等。 – TLP 2014-09-25 10:52:01

回答

1
while (my $line = $remote_file_content) { 
     $counter++; 
     if ($line =~ /"biome":{"unit":"","required":"1","value":"([A-Za-z0-9_\-. ]*)",/) { 
      print $counter."\t".$directory."\t".$1."\n"; 
     } 
    } 

這個循環,只會一次$remote_file_content是假的(即空的),因爲你沒有last或其他方式退出循環。 但是,在這個循環中你永遠不會改變$remote_file_content。 這意味着,一旦你輸入它,你將永遠不會離開循環。

0

你是想分別處理還是作爲整體處理文件中的每一行?

如果你這樣做是作爲一個整體,擺脫while循環,並做到這一點:

for my $directory ($ftp->ls) { 
    $ftp->cwd($directory); 
    my ($remote_file_content, $remote_file_handle); 
    open($remote_file_handle, ">", \$remote_file_content); 
    $ftp->get("metadata.project-" . $directory . ".json", $remote_file_handle) 
     or die "Get failed.\n"; 
    $counter++; 
    if ($remote_file_content =~ /"biome":{"unit":"","required":"1","value":"([A-Za-z0-9_\-. ]*)",/) { 
     print $counter. "\t" . $directory . "\t" . $1 . "\n"; 
    } 
    close $remote_file_handle; 
    $ftp->cwd(".."); 
} 

如果要單獨處理的每一行:

for my $directory ($ftp->ls) { 
    $ftp->cwd($directory); 
    my ($remote_file_content, $remote_file_handle); 
    open($remote_file_handle, ">", \$remote_file_content); 
    $ftp->get("metadata.project-" . $directory . ".json", $remote_file_handle) 
     or die "Get failed.\n"; 
    foreach my $line (split "\n", $remote_file_content) { 
     $counter++; 
     if ($line =~ /"biome":{"unit":"","required":"1","value":"([A-Za-z0-9_\-. ]*)",/) { 
      print $counter. "\t" . $directory . "\t" . $1 . "\n"; 
     } 
    } 
    close $remote_file_handle; 
    $ftp->cwd(".."); 
} 

你關閉文件名而不是文件句柄,關閉失敗,您只是不知道它,因爲當變量超出範圍時會自動調用close。