2012-09-07 80 views
1

同時在URL的數據庫上執行file :: fetch操作時,某些URL僅包含頂級域名,例如http://google.com。我如何構建我的,如果檢查,這樣它將驗證是否有一個文件來獲取,所以當我創建一個新的文件::取回對象,它難道不把我這個錯誤:Perl檢查是否存在要提取的url中的文件

Use of uninitialized value $path in pattern match (m//) at C:/Perl/lib/File/Spec/Unix.pm line 267.
Use of uninitialized value in string eq at C:/Perl/lib/File/Fetch.pm line 395.

這裏是一個我的代碼片段,我試圖做一些驗證

my $uri_handle = File::Fetch->new(uri => $url); 
my $getfile = $uri_handle ->file; 
if ($getfile){ 
    my $dir_handle = $uri_handle->fetch(to => $dir) or die "Couldn't fetch file: $uri_handle->error\n"; 
    #print "[ID:$myid] File fetch completed!\n\n"; 
}else{ 
    print "[ID:$myid] There is no file to be fetched from $url\n\n"; 
} 

但文件方法也失敗,因爲它無法檢索URL的文件名。

Thread 1 terminated abnormally: Can't call method "file" on an undefined value at C:\test\multihashtest2.pl line 102. 
+1

如果檢查怎麼辦? – mob

+0

是否有一個函數或模塊來幫助我驗證是否有URL指向要提取的文件。假設我可以使用這樣的函數來進行驗證檢查,然後再創建對象,以便file :: fetch不會失敗 –

+0

很高興看到一些代碼,而不僅僅是錯誤。新方法應該在失敗時返回false。無論如何,您可以使用Try :: Tiny或將其包裝在一個評估中。 –

回答

1

你的perl腳本會不知道什麼是web服務器上的,什麼不是,直到它嘗試加載一個URI - 這並不重要的URL看起來像。您需要嘗試獲取文件並優雅地處理任何錯誤。

如果您發佈您的代碼,這將有所幫助,但您可以通過查看the documentation來回答自己的問題。

特別是,new()方法returns false on error,但這只是驗證URI實際提取之前。當你在你的File :: Fetch對象上調用fetch()時,Returns the full path to the downloaded file on success, and false on failure.

因此,處理這些方法相應地返回的內容。

編輯:現在您發佈了代碼。如果錯誤是抱怨$ uri_handle未定義,請檢查$ url是否正確設置並檢查錯誤。在第1行之後:

print $url; 
print $uri_handle->error; 
+0

確實定義了URL,但File :: Fetch對象將保持未定義「線程2異常終止:無法調用方法」錯誤「在C:\ test \ multihashtest2.pl第104行的未定義值處。' 因爲我認爲我的網址恰好沒有要抓取的文件。 (我的情況發生,有些文件被提取,有些不) 我認爲最好的方法是嘗試@Bill說過的話,順便使用try :: tiny –

+0

,第104行是'my $ uri_handle = File :: Fetch-> new(uri => $ url);' –

+0

我會在錯誤中給出的行中查看Unix.pm和Fetch.pm。這可能是因爲模式匹配失敗,所以期望在路徑的最後部分有一段時間,或者一個'.html'等等,這將確認您的懷疑。當你只需要一個遠程目錄時,由網絡服務器決定實際提供哪個文件 - 通常是由index.html,index.htm,index.php等組成的列表 – carillonator