Comment obtenir le résultat de curl dans une variable en Perl si je l'invoque à l'aide de backtics?

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

  •  06-07-2019
  •  | 
  •  

Question

J'essaie d'obtenir la réponse d'un appel curl dans une variable en perl.

my $foo = `curl yadd yadda`;

print $foo;

ne fonctionne pas. Lorsque je lance ceci en ligne de commande, l’appel curl imprime toutes ses sorties correctement dans le terminal, mais la variable n’est pas renseignée avec ces données.

Existe-t-il un moyen de le faire sans installer ni appeler la bibliothèque Perl curl?

Était-ce utile?

La solution

Il envoie probablement ses données à stderr. Essayez

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

Autres conseils

Vous pouvez également envisager de regarder LWP :: UserAgent ou même LWP :: Simple .

Que voulez-vous vraiment faire? Utilisez curl à tout prix, ou récupérez le contenu d’une page Web?

Une façon plus simple de le faire (qui ne repose sur aucun programme externe pouvant être installé ou non sur le prochain ordinateur sur lequel vous devez le faire) serait:

use LWP::Simple;

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

Si vous voulez savoir pourquoi l'échec de GET ou récupérer plusieurs pages du même site, vous devrez utiliser un peu plus de machines. perldoc lwpcook vous aidera à démarrer.

Dans le shell 2 > signifie redirect fileno 2. Fileno 2 est toujours ce que le programme voit comme stderr. De même, fileno 0 est stdin et fileno 1 est stdout. Ainsi, lorsque vous dites 2 > & amp; 1 , vous indiquez au shell de rediriger stderr (fichier 2) vers la sortie standard (fichier 1). Étant donné que l'opérateur backticks utilise le shell pour exécuter la commande que vous spécifiez, vous pouvez utiliser la redirection de shell, afin

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

dit à curl de rediriger sa sortie vers stdout, et puisque l'opérateur de backtick attrape stdout, vous obtenez ce que vous cherchiez.

Essayez ceci:

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

curl affiche les informations de progression sur stderr. Le fait de les rediriger vers / dev / null facilite la visualisation de ce qui se passe.

Cela fonctionne sur mon système:

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

Vous pouvez ouvrir un pipe comme s'il s'agissait d'un fichier.

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

Il se peut que certaines des sorties que vous souhaitez capturer soient en err standard, et non en sortie standard. Essayez ceci:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top