¿Cómo obtengo el resultado de curl en una variable en Perl si lo invoco usando backtics?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de obtener la respuesta de una llamada curl en una variable en perl.

my $foo = `curl yadd yadda`;

print $foo;

no funciona. Cuando ejecuto esto en la línea de comando, la llamada curl imprime toda su salida correctamente en el terminal, pero la variable no se llena con esos datos.

¿Hay alguna manera de hacer esto sin instalar y llamar a Perl curl lib?

¿Fue útil?

Solución

Probablemente envía sus cosas a stderr. Probar

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

Otros consejos

También puede considerar mirar LWP :: UserAgent o incluso LWP :: Simple .

¿Qué es lo que realmente quieres hacer? ¿Usar curl a toda costa, o tomar el contenido de una página web?

Una forma más inteligente de hacerlo (que no se basa en ningún programa externo que pueda o no instalarse en la próxima máquina donde necesite hacer esto) sería:

use LWP::Simple;

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

Si desea ver por qué falló el GET, o tomar varias páginas del mismo sitio, necesitará usar un poco más de maquinaria. perldoc lwpcook lo ayudará a comenzar.

En el shell 2 > significa redirigir fileno 2. Fileno 2 es siempre lo que un programa ve como stderr. Del mismo modo, fileno 0 es stdin y fileno 1 es stdout. Entonces, cuando dices 2 > & amp; 1 le estás diciendo al shell que redirija stderr (fileno 2) a stdout (fileno 1). Dado que el operador de backticks usa el shell para ejecutar el comando que especifique, puede usar el redireccionamiento del shell, así que

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

le dice a curl que redirija su salida a stdout, y dado que el operador de backtick atrapa stdout, obtienes lo que estabas buscando.

Prueba esto:

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

curl muestra información de progreso en stderr, redirigiendo eso a / dev / null hace que sea más fácil ver lo que está sucediendo.

Esto funciona en mi 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.

Puede abrir una tubería como si fuera un archivo.

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

Puede ser que parte de la salida que desea capturar esté en error estándar, no en salida estándar. Prueba esto:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top