Como faço para obter a saída de onda em uma variável em Perl se eu invocá-lo usando backtics?

StackOverflow https://stackoverflow.com/questions/1015438

  •  06-07-2019
  •  | 
  •  

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?

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top