Como faço para obter a saída de onda em uma variável em Perl se eu invocá-lo usando backtics?
Pergunta
Eu estou tentando obter a resposta de uma chamada de onda em uma variável em Perl.
my $foo = `curl yadd yadda`;
print $foo;
não funciona. Quando eu executar este na linha de comando da chamada onda imprime toda a sua saída corretamente no terminal, mas a variável não é preenchido com os dados.
Existe uma maneira de fazer isso sem instalar e chamando o Perl onda lib?
Solução
Provavelmente envia seu material para stderr. Tentar
my $foo = `curl yadd yadda 2>&1`;
Outras dicas
Você também pode considerar a olhar para LWP :: UserAgent ou mesmo LWP :: Simple .
O que você realmente quer fazer? Use curl
a todo custo, ou pegar o conteúdo de uma página web?
Uma maneira mais perlish de fazer isso (que conta com nenhum programa externo que podem ou não podem ser instalados na próxima máquina em que você precisa para fazer isso) seria:
use LWP::Simple;
my $content = get("http://stackoverflow.com/questions/1015438/")
or die "no such luck\n";
Se você quiser ver por que o GET falhou, ou pegar várias páginas do mesmo site, você vai precisar usar um pouco mais máquinas. perldoc lwpcook
irá ajudar a começar.
Nos meios shell 2>
redirecionar fileno 2. Fileno 2 é sempre o que um programa vê como stderr. Da mesma forma, fileno 0 é stdin e fileno 1 é stdout. Então, quando você diz 2>&1
você está dizendo ao shell para stderr redirecionamento (fileno 2) em stdout (fileno 1). Desde o operador backticks usa o shell para executar o comando que você especificar, você pode usar o redirecionamento shell, então
my $foo = `curl yadda yadda 2>&1`;
está dizendo onda para redirecionar sua saída em stdout, e desde que a crase capturas operador stdout, você recebe o que você estava procurando.
Tente isto:
$var = `curl "http://localhost" 2>/dev/null`;
print length($var)
curl
exibe informações de progresso no stderr, redirecionando que para / dev / null torna mais fácil ver o que está acontecendo.
Isso funciona em meu sistema:
#!/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.
Você pode abrir um tubo, como se fosse um arquivo.
$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;
Pode ser que alguns dos resultados que pretende capturar está em err padrão, não por padrão. Tente isto:
my $foo = system "curl http://www.stackoverflow.com";
print $foo;