如何从URL读取行?

时间:2014-05-05 11:00:44

标签: perl

我正在寻找下面(虚构的)openremote的“道德等同物”:

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的解决方案不适合。)

我确信这是非常基本的东西,但经过大量搜索后我找不到它。

3 个答案:

答案 0 :(得分: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()等)。

干杯。

答案 1 :(得分:1)

您可以使用LWP :: UserAgent的参数:content_file =&gt; $ filename将大文件直接保存到磁盘,无需用它填充内存,然后就可以在程序中读取该文件了。

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

或者你可以使用参数:content_cb =&gt;回调和回调子程序中,您可以在下载时按块处理数据块。这可能就是你需要的方式。

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

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

使用perldoc LWP :: UserAgent阅读(稍微)一下这个。

答案 2 :(得分:0)

使用LWP :: Simple与IO :: String结合使用,如下所示:

#!/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;

希望它适合你。