2014-05-05 85 views
3

我找的(虛構的)「道德等價物」 openremote如下:如何從URL行讀取?

my $handle = openremote('http://some.domain.org/huge.tsv') or die $!; 
while (<$handle>) { 
    chomp; 
    # etc. 
    # do stuff with $_ 
} 
close $handle; 

IOW,我正在尋找一種方式來打開讀取手柄到遠程文件,這樣我可以讀從它一行一行。 (通常這個文件將比我想要完全讀入內存的文件大,這意味着將基於將LWP::Simple::get(例如)返回的值填充到IO::String的解決方案不適合。)

我確定這是非常基本的東西,但是我經過很多搜索後一直無法找到它。

+1

當您閱讀時,您想要用數據做什麼? – Borodin

+0

@kjo也許嘗試IO ::套接字。看看http://stackoverflow.com/questions/9227603/perl-creating-a-socket – pcantalupo

+0

因此,你不想獲取文件,並從它讀取,你想通過網絡讀取它?這是[POE'](http://poe.perl.org/)的工作嗎?還是我誤解了你的問題? –

回答

0

使用LWP ::簡單的加上IO ::字符串,像這樣:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use LWP::Simple; 
use IO::String; 

my $handle = IO::String->new(get("http://stackoverflow.com")); 
while (defined (my $line = <$handle>)) { 
    print $line; 
} 
close $handle; 

希望它爲你工作。

保羅

+0

謝謝,但是這個解決方案需要將URL的全部內容讀入內存,這是我特意說我不想做的事情。 (我編輯了我的帖子,使這一點更加明確。) – kjo

1

這裏有一個「解決方案」就像其他的答覆,但它通過使用IO::All

use IO::All ; 
my $http_io = io->http("http://some.domain.org/huge.tsv"); 

while (my $line = $http_io->getline || $http_io->getline) { 
    print $line; 
} 

後你有io->http一個對象,你可以使用IO方法來看待它欺騙了一下(如getline()等)。

乾杯。

0

您可以使用LWP :: UserAgent的參數:content_file => $ filename直接將大文件保存到磁盤,而不用填充內存,然後您可以在程序中讀取該文件。

$ua->get($url, ':content_file' => $filename); 

或者你也可以使用參數:content_cb => \ &回調,並在回調子例程您可以通過塊,因爲它是下載處理的數據塊。這可能是你需要的方式。

$ua->get($url, ':content_cb' => \&callback); 

sub callback { 
    my ($chunk, $response, $protocol) = @_; 
    #Do whatever you like with $chunk 
} 

用perldoc LWP :: UserAgent閱讀(稍微)一下。