我正在寻找下面(虚构的)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
的解决方案不适合。)
我确信这是非常基本的东西,但经过大量搜索后我找不到它。
答案 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;
希望它适合你。
保