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

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

my $foo = `curl yadd yadda`;

print $foo;

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

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

Ответы [ 8 ]

13 голосов
/ 19 июня 2009

Вероятно, он отправляет свои вещи в stderr. Попробуйте

my $foo = `curl yadd yadda 2>&1`;
5 голосов
/ 19 июня 2009

Вы также можете рассмотреть LWP :: UserAgent или даже LWP :: Simple .

4 голосов
/ 21 июня 2009

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

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

use LWP::Simple;

my $content = get("/976674/kak-poluchit-vyvod-curl-v-peremennuy-v-perl-esli-ya-vyzyvay-ego-s-pomoschy-backtics")
   or die "no such luck\n";

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

3 голосов
/ 19 июня 2009

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

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

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

0 голосов
/ 22 мая 2014

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

$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;
0 голосов
/ 19 июня 2009

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

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

и т.д.

0 голосов
/ 19 июня 2009

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

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
0 голосов
/ 19 июня 2009

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

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

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

...