Perl:从URL打开文件

时间:2017-08-29 08:08:32

标签: perl

我想知道如何从URL而不是本地文件打开文件,我在另一个帖子上找到了以下答案:

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

这完全适用于我的电脑......

但是当我将代码转移到我的托管服务器时,它抱怨它无法找到IO模块。那么还有另一种从URL打开文件的方法,它不需要任何外部模块(或使用几乎安装在每台服务器上的模块)......?

2 个答案:

答案 0 :(得分:5)

您可以安装PerlIO::http,它会为您提供一个输入图层,用于通过open从网址打开文件句柄。这个东西不包含在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>) { ... }

答案 1 :(得分:4)

没有办法像你要求的那样“从URL打开文件”。好吧,我想你可以使用来自LWP :: UserAgent的progress()回调一起扔东西,但即便如此,我认为它不会按照你想要的方式工作。

但你可以做一些看起来很容易做你想做的事。实际上,我们真正做的是从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);