Как мне получить результат работы curl в переменную Perl, если я вызываю ее с помощью обратных знаков?
Вопрос
Я пытаюсь получить ответ на вызов Curl в переменную Perl.
my $foo = `curl yadd yadda`;
print $foo;
не работает.Когда я запускаю это в командной строке, вызов Curl правильно печатает весь свой вывод в терминале, но переменная не заполняется этими данными.
Есть ли способ сделать это без установки и вызова библиотеки Perl Curl?
Решение
Вероятно, он отправляет свои вещи в stderr. Попробуйте
my $foo = `curl yadd yadda 2>&1`;
Другие советы
Вы также можете посмотреть на LWP :: UserAgent или даже LWP :: Simple а>. р>
Что ты действительно хочешь сделать? Использовать curl
любой ценой или захватить содержимое веб-страницы?
Более изощренный способ сделать это (который основан на отсутствии внешних программ, которые могут или не могут быть установлены на следующем компьютере, на котором вам нужно это сделать), будет:
use LWP::Simple;
my $content = get("http://stackoverflow.com/questions/1015438/")
or die "no such luck\n";
Если вы хотите узнать, почему произошел сбой GET, или захватить несколько страниц с одного сайта, вам нужно использовать немного больше механизмов. perldoc lwpcook
поможет вам начать работу.
В оболочке 2 >
означает перенаправление fileno 2. Fileno 2 - это всегда то, что программа видит как stderr. Аналогично, fileno 0 - это стандартный ввод, а fileno 1 - это стандартный вывод. Итак, когда вы говорите 2 > & amp; 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">
и т. д.
Вы можете открыть канал, как если бы это был файл.
$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;