我想知道如何从URL而不是本地文件打开文件,我在另一个帖子上找到了以下答案:
use IO::String;
my $handle = IO::String->new(get("google.com"));
my @lines = <$handle>;
close $handle;
这完全适用于我的电脑......
但是当我将代码转移到我的托管服务器时,它抱怨它无法找到IO模块。那么还有另一种从URL打开文件的方法,它不需要任何外部模块(或使用几乎安装在每台服务器上的模块)......?
答案 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);