Как получить вывод curl в переменную в Perl, если я вызываю его с помощью backtics?

Я пытаюсь получить ответ на вызов curl в переменную в perl.

my $foo = `curl yadd yadda`;

print $foo;

не работает. Когда я запускаю это в командной строке, вызов curl печатает все свои выходные данные правильно в терминале, но переменная не заполнена этими данными.

есть ли способ сделать это без установки и вызова Perl curl lib?

8 ответов


вероятно, он отправляет свои материалы в stderr. Попробуй!--2-->

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

вы также можете рассмотреть возможность просмотра LWP:: UserAgent или даже LWP:: простой.


что вы действительно хотите делать? Использовать curl любой ценой, или захватить содержимое веб-страницы?

более опасный способ сделать это (который не зависит от внешних программ, которые могут быть установлены или не установлены на следующей машине, где вам нужно это сделать):

use LWP::Simple;

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

Если вы хотите увидеть, почему получить не удалось, или захватить несколько страниц с того же сайта, Вам нужно будет использовать немного больше машин. perldoc lwpcook поможет вам начать.


в корпусе 2> означает перенаправление fileno 2. Fileno 2-это всегда то, что программа видит как stderr. Аналогично, fileno 0 является stdin, а fileno 1-stdout. Итак, когда вы говорите 2>&1 вы говорите оболочке перенаправить stderr (fileno 2) в stdout (fileno 1). Поскольку оператор backticks использует оболочку для выполнения указанной команды, вы можете использовать перенаправление оболочки, поэтому

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

говорит curl перенаправить свой выход в stdout, и с оператора backtick ловит stdout, вы получаете то, что искали.


попробуйте это:

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

curl отображает информацию о ходе работы stderr, перенаправляя ее в /dev / null, что облегчает просмотр происходящего.


это работает в моей системе:

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

etc.


вы можете открыть трубу, как если бы это был файл.

$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;

возможно, некоторые выходные данные, которые вы хотите захватить, находятся в стандартной ошибке, а не в стандартной. Попробуйте это:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;