2017-08-29 43 views
-1

我想知道如何從一個網址,而不是一個本地文件打開一個文件打開一個文件,我發現了以下的答案在另一個線程:的Perl:從URL

use IO::String; 
my $handle = IO::String->new(get("google.com")); 
my @lines = <$handle>;      
close $handle; 

這工作完全.. 。在我的電腦上...

但是,當我將代碼轉移到我的託管服務器時,它抱怨說找不到IO模塊。那麼還有另一種從URL打開文件的方式,它不需要任何外部模塊(或者使用幾乎安裝在每臺服務器上的模塊)......?

+0

模塊'IO :: String'提供了非常具體的功能。你確定你需要嗎? 「_open來自URL_的文件」是什麼意思? - 你有特別的理由使用文件風格的操作嗎?有很多方法可以從Internet上檢索和管理內容。你究竟需要做什麼? – zdim

+0

我已經重新打開了這個問題。這當然不是人們提出的問題的重複。它看起來像是重複的,因爲看起來OP在尋找解決方案時走錯了路。 –

+0

'my $ handle = IO :: String-> new(get(「google.com」));我的@lines = <$handle>;'完全沒有意義。 –

回答

4

按照您的要求,沒有辦法「從URL打開文件」。好吧,我想你可以使用LWP :: UserAgent的回調函數將一些東西扔在一起,但即使如此,我認爲它不會按照你想要的方式工作。

但是你可以做出一些看起來像是在做你想做的事情。實際上,我們真正在做的是從URL中取回所有數據,然後在包含該數據的字符串上打開文件句柄。

use LWP::Simple; 

my $data = get('https://google.com'); 
open my $url_fh, '<', \$data or die $!; 

# Now $url_fh is a filehandle wrapped around your data. 
# Treat it like any other filehandle. 

while (<$url_fh>) { 
    print; 
} 

你的問題是沒有安裝IO :: String。但是沒有必要安裝它,因爲它足夠簡單地完成它對標準Perl功能的操作(只需打開一個對字符串引用的文件句柄)。

更新: IO :: String在這裏完全沒有必要。不僅因爲你可以簡單地完成它的操作,只需在對字符串的引用上打開一個文件句柄,而且因爲所有你想要做的就是從一個網站讀取一個文件到一個數組中。在這種情況下,您的代碼很簡單:

use LWP::Simple; 

my $url = 'something'; 
my @records = split /\n/, get($url); 

您甚至可以考慮添加一些錯誤處理。

use LWP::Simple; 

my $url = 'something'; 
my $data = get($url); 
die "No data found\n" unless defined $data; 
my @array = split /\n/, get($url); 
+2

實際上LEONT在幾年前寫道https://metacpan.org/pod/PerlIO::http,它可以讓你簡單地「打開」一個URL。但是,我猜,OP不會在他們的共享主機上安裝它。 – simbabque

+0

謝謝,這是我需要並擺脫IO:字符串問題 – jxm

5

您可以安裝PerlIO::http,這將給你通過open從URL打開文件句柄的輸入層。這個東西沒有包含在Perl核心中,但它是will work with Perls as early as 5.8.9

安裝完成後,您只需要在模式參數中使用open以及:http圖層。這裏沒有什麼use。這會自動發生。

open my $fh, '<:http', 'https://metacpan.org/recent'; 

然後,您可以像$fh一樣從常規文件中讀取。在引擎蓋下,它會照顧通過電線獲取數據。

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