2015-04-04 94 views
-4

文件沒有下載,請幫忙。正在下載文本文件:Perl

#!/usr/bin/perl -w 
require HTTP::Response; 
require LWP::UserAgent; 
open (INPUT, "ndb_id_file.txt") or die "can't open ndb_id_file.txt"; 
@input = <INPUT> 
foreach $line(@input) { 
    $ua = LWP::UserAgent->new; 
    $ua->env_proxy('http'); 
    $ua->proxy(['http', 'ftp'],'http://144020019:*******@netmon.****.ac.in:80'); 
    response = 
     $ua->get('www.ndbserver.rutgers.edu/files/ftp/NDB/coordinates/na-biol/$line'); 
    if ($response->is_success) { 
     $content = $response->content(); 
     open(OUT,">$line.pdb") or die "Output file $line cannot be produced... Error..."; 
     print (OUT "$content"); 
    } 
} 
+2

在代碼中使用'use warnings'和'use strict'。 – serenesat 2015-04-04 15:40:17

+0

我使用嚴格和警告。它說$ $ response,content和line需要一個明確的包名稱。我檢查了perl模塊是否存在cpan LWP :: UserAgent和cpan HTTP :: Response通過命令行。它說這兩個模塊都是最新的 – phani 2015-04-04 16:35:10

+1

這很有趣。即使沒有這些措施,我也會在E:\ Perl \ source \ resp.pl第10行中得到'未引用的字符串「響應」與將來的保留字衝突。','E:\ Perl \ source \ resp中的語法錯誤。 pl行6附近「$ line(」','E:\ Perl \ source \ resp.pl第17行附近的語法錯誤,}「','執行E:\ Perl \ source \ resp.pl中止編譯錯誤。「你真的無法自己解決這些問題嗎? ' – Borodin 2015-04-04 22:25:26

回答

2

您的程序有許多問題。其中主要在這條線是

response = $ua->get('www.ndbserver.rutgers.edu/files/ftp/NDB/coordinates/na-biol/$line'); 
  • 您正在嘗試將分配給response$line值不被插入到URL,因爲你這是不是一個變量名

  • 使用單引號

  • $line的內容以換行符結尾,應使用chomp

  • 的URL沒有方案 - 它應該http://

從這些點

除了開始,你應該解決這些問題

  • 必須始終use strictuse warnings的頂部每你寫的Perl程序。在shebang線上添加-w遠遠不如

  • 您應該use而不是requireLWP::UserAgent。而且也沒有必要也use HTTP::Response,因爲它是加載LWP

    的一部分
  • 你應該總是使用與詞法文件句柄三參數形式open。而如果open失敗,你應該打印一個die字符串,包括$!這給原因失敗的價值

  • 您應該使用while從文件一行讀取數據的時間,除非你有一次性在內存中全部需要它的一個很好的理由

  • 每次在循環中都不需要創建新的用戶代理$ua。只是要一個,並用它來獲取每一個URL

  • 您應該使用decoded_content而不是content在情況下HTTP::Response消息的內容獲取它被壓縮

下面是包括所有的程序這些修復。我沒有能夠測試它,但它確實編譯

#!/usr/bin/perl 
use strict; 
use warnings; 

use LWP::UserAgent; 

my $in_file = 'ndb_id_file.txt'; 

open my $fh, '<', $in_file or die qq{Unable to open "$in_file" for input: $!}; 

my $ua = LWP::UserAgent->new; 
$ua->env_proxy('http'); 
$ua->proxy(['http', 'ftp'], 'http://144020019:*******@netmon.****.ac.in:80'); 

while (my $line = <$fh>) { 

    chomp $line; 
    my $url = "http://www.ndbserver.rutgers.edu/files/ftp/NDB/coordinates/na-biol/$line"; 
    my $response = $ua->get($url); 

    unless ($response->is_success) { 
     warn $response->status_line; 
     next; 
    } 

    my $content = $response->decoded_content; 
    my $out_file = "$line.pdb"; 

    open my $out_fh, '>', $out_file or die qq{Unable to open "$out_file" for output: $!}; 
    print $out_fh $content; 
    close $out_fh or die qq{Unable to close "$out_file": $!}; 
}