Wie kann ich die Ausgabe von curl in eine Variable in Perl, wenn ich es mit backtics aufrufen?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich versuche, die Antwort eines curl Aufruf in eine Variable in Perl zu bekommen.

my $foo = `curl yadd yadda`;

print $foo;

funktioniert nicht. Wenn ich dies in der Befehlszeile ausführen, um den curl Aufruf druckt alle seine Ausgabe richtig in der Klemme, aber die Variable nicht mit diesen Daten gefüllt ist.

Gibt es eine Möglichkeit, dies zu tun, ohne die Installation und die Perl curl lib nennen?

War es hilfreich?

Lösung

Es sendet wahrscheinlich seine Sachen zu stderr. Versuchen

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

Andere Tipps

Sie können auch unter LWP :: suchen betrachten Useragent oder sogar LWP :: Simple .

Was wollen Sie wirklich tun? Verwenden Sie curl um jeden Preis, oder packen Sie den Inhalt einer Web-Seite?

Eine Perlish Art und Weise, dies zu tun (was auf keine externen Programmen beruht, die in dem Sie dies tun müssen, kann oder nicht auf der nächsten Maschine installiert werden) wäre:

use LWP::Simple;

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

Wenn Sie sehen wollen, warum die GET fehlgeschlagen ist, oder greifen mehrere Seiten aus dem gleichen Ort, werden Sie ein bisschen mehr Maschinen verwenden müssen. perldoc lwpcook werden Sie beginnen.

In der Shell 2> bedeutet fileno 2. Fileno 2 umleiten ist immer das, was ein Programm wie stderr sieht. In ähnlicher Weise fileno 0 ist stdin und fileno 1 stdout wird. Also, wenn Sie sagen, 2>&1 Sie die Shell sagen stderr zu umleiten (fileno 2) in stdout (fileno 1). Da der Bediener die Backticks die Shell verwendet geben Sie den Befehl, den Sie ausführen, können Sie Shell-Umleitung verwenden, so

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

sagt Locke seine Ausgabe in stdout zu umleiten, und da der Backtick-Operator stdout fängt, bekommen Sie, was Sie suchen.

Versuchen Sie folgendes:

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

curl zeigt Statusinformationen über stderr, Umleitung, dass auf / dev / null macht es leichter zu sehen, was los ist.

Das funktioniert auf meinem System:

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

Sie können ein Rohr öffnen, als ob es sich um eine Datei waren.

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

Es könnte sein, dass ein Teil der Ausgabe, die Sie aufnehmen möchten, in Standardfehlerlog ist, nicht Standard aus. Versuchen Sie folgendes:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top