9

我正在尝试将 curl 调用的响应转换为 perl 中的变量。

my $foo = `curl yadd yadda`;

print $foo;

不起作用。当我在命令行上运行它时,curl 调用会在终端中正确打印其所有输出,但变量没有填充该数据。

有没有办法在不安装和调用 Perl curl 库的情况下做到这一点?

4

9 回答 9

13

它可能会将其内容发送到 stderr。尝试

my $foo = `curl yadd yadda 2>&1`;
于 2009-06-18T22:03:37.417 回答
5

您还可以考虑查看LWP::UserAgent甚至LWP::Simple

于 2009-06-19T01:16:03.613 回答
4

你真正想做的是什么?不惜一切代价使用curl,还是抓取网页的内容?

一种更糟糕的方法(它不依赖于可能会或可能不会安装在您需要执行此操作的下一台机器上的任何外部程序)是:

use LWP::Simple;

my $content = get("http://stackoverflow.com/questions/1015438/")
   or die "no such luck\n";

如果您想查看 GET 失败的原因,或者从同一个站点获取多个页面,则需要使用更多的机器。perldoc lwpcook会让你开始。

于 2009-06-21T11:47:24.350 回答
3

在 shell2>中意味着重定向 fileno 2。 Fileno 2 始终是程序视为 stderr 的内容。同样,fileno 0 是标准输入,fileno 1 是标准输出。因此,当您说2>&1您是在告诉 shell 将 stderr(fileno 2)重定向到 stdout(fileno 1)时。由于反引号操作符使用 shell 来运行你指定的命令,你可以使用 shell 重定向,所以

my $foo = `curl yadda yadda 2>&1`;

告诉 curl 将其输出重定向到标准输出,并且由于反引号运算符捕获标准输出,因此您得到了您想要的。

于 2009-06-18T22:14:05.727 回答
1

很老的帖子,但是在反引号中使用 curl 的真正方法是使用适当的 curl 开关。

这个开关是-o,它定义了将输出发送到哪里。

更多来自 curl 手册页:

将输出指定为“-”(单破折号)将强制输出到标准输出。

这也可以防止在$foo中出现可能的错误,如果您将完整的 STDERR 重定向到错误的 STDOUT 会发生这种情况:

my $foo = `curl -o - yadd yadda`;
于 2020-08-29T21:24:41.073 回答
0

试试这个:

$var = `curl "http://localhost" 2>/dev/null`; 
print length($var)

curl在 stderr 上显示进度信息,将其重定向到 /dev/null 可以更轻松地查看正在发生的事情。

于 2009-06-18T22:06:31.313 回答
0

这适用于我的系统:

#!/usr/bin/perl

use strict;
use warnings;

my $output = `curl www.unur.com`;

print $output;

__END__

C:\> z1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

等等

于 2009-06-18T22:09:28.640 回答
0

您可以像打开文件一样打开管道。

$url = "\"http://download.finance.yahoo.com/d/quotes.csv?s=" . 
"$symbol&f=sl1d1t1c1ohgvper&e=.csv\"";

open CURL, "curl -s $url |" or die "single_stock_quote: Can't open curl $!\n";
$line = <CURL>;
close CURL;
于 2014-05-22T05:44:20.597 回答
-1

您想要捕获的某些输出可能是标准错误,而不是标准输出。试试这个:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
于 2009-06-18T22:06:56.803 回答