Come faccio a ottenere l'output di curl in una variabile in Perl se lo invoco usando backtics?
Domanda
Sto cercando di ottenere la risposta di una chiamata a ricciolo in una variabile in perl.
my $foo = `curl yadd yadda`;
print $foo;
non funziona. Quando eseguo questo dalla riga di comando, la chiamata curl stampa tutto il suo output correttamente nel terminale, ma la variabile non è piena di quei dati.
Esiste un modo per farlo senza installare e chiamare la libreria di arricciatura Perl?
Soluzione
Probabilmente invia le sue cose a stderr. Prova
my $foo = `curl yadd yadda 2>&1`;
Altri suggerimenti
Potresti anche considerare di guardare LWP :: UserAgent o anche LWP :: Simple .
Cosa vuoi veramente fare? Usa curl
a tutti i costi o prendi i contenuti di una pagina web?
Un modo più perlish di farlo (che non si basa su nessun programma esterno che può o non può essere installato sul prossimo computer dove è necessario farlo) sarebbe:
use LWP::Simple;
my $content = get("http://stackoverflow.com/questions/1015438/")
or die "no such luck\n";
Se vuoi vedere perché il GET non è riuscito, o prendere più pagine dallo stesso sito, dovrai usare un po 'più di macchine. perldoc lwpcook
ti farà iniziare.
Nella shell 2 >
significa reindirizzare fileno 2. Fileno 2 è sempre ciò che un programma vede come stderr. Allo stesso modo, fileno 0 è stdin e fileno 1 è stdout. Quindi, quando dici 2 > & amp; 1
stai dicendo alla shell di reindirizzare stderr (fileno 2) in stdout (fileno 1). Poiché l'operatore backticks utilizza la shell per eseguire il comando specificato, è possibile utilizzare il reindirizzamento della shell, quindi
my $foo = `curl yadda yadda 2>&1`;
sta dicendo a curl di reindirizzare il suo output in stdout, e poiché l'operatore backtick cattura stdout, ottieni quello che stavi cercando.
Prova questo:
$var = `curl "http://localhost" 2>/dev/null`;
print length($var)
curl
mostra le informazioni sullo stato di avanzamento su stderr, reindirizzando che a / dev / null rende più facile vedere cosa sta succedendo.
Funziona sul mio 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">
ecc.
Puoi aprire una pipe come se fosse un file.
$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;
È possibile che parte dell'output che si desidera acquisire sia in errore standard, non in uscita standard. Prova questo:
my $foo = system "curl http://www.stackoverflow.com";
print $foo;