2009-06-18 11 views
7

Sto cercando di ottenere la risposta di una chiamata di arricciatura in una variabile in perl.Come ottengo l'output di arricciatura in una variabile in Perl se la invoco usando i backtics?

my $foo = `curl yadd yadda`; 

print $foo; 

non funziona. Quando lo eseguo alla riga di comando, la chiamata di arricciatura stampa correttamente tutto il suo output nel terminale, ma la variabile non viene riempita con quei dati.

C'è un modo per farlo senza installare e chiamare la lib di Perl curl?

risposta

12

Probabilmente invia le sue informazioni a stderr. Prova

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

Che ha fatto! Grazie!. Ti darò il segno di spunta se riesci ad aggiungere una o due frasi su cosa fa effettivamente> 2 & 1 e perché spostarlo da stderr a qualunque cosa & 1 lo scarichi nella variabile. Grazie mille! –

+1

2> foo significa "reindirizza lo stderr nel file pippo". & 1 significa stdout, cioè reindirizza lo stderr su stdout.Puoi anche farlo in un altro modo: "> & 2" che significa "reindirizzamento da stdout a stderr". Per reindirizzare sia stdout che stderr, puoi usare "> &", ad esempio foocommand &> file_with_boththings.txt – sunny256

+0

La notazione '2> & 1' significa che il descrittore di file 2 (stderr) è inviato nello stesso posto del descrittore di file 1 (stdout) viene inviato a. Quindi sia l'output standard che l'errore standard vengono scritti nello stesso punto (output standard). E i backtick di Perl catturano l'output standard del comando eseguito, quindi ... –

0

Prova questa:

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

curl mostra progressi informazioni su stderr, reindirizzando che a/dev/null rende più facile vedere cosa sta succedendo.

-1

Potrebbe essere che parte dell'output che si desidera acquisire sia in errore standard, non standard. Prova questo:

my $foo = system "curl http://www.stackoverflow.com"; 
print $foo; 
+1

questo non fa quello che pensi che faccia. – Geo

0

questo 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

+0

Penso che potresti interpretare erroneamente la stampa del ricciolo per la dichiarazione di stampa che hai lì. Prova a stampare "OUTPUT = $ output" e vedi se ottieni il risultato giusto. L'ho fatto anche io e stampa l'output del ricciolo e poi stampa "OUTPT =" perché non ha mai ottenuto il risultato nella var. Tuttavia, la risposta sopra è corretta. –

+0

@ Dr.Dredel se rimuovo l'istruzione di stampa, vedo le informazioni sull'avanzamento che arricciano le stampe su stderr, ma non l'output di arricciatura. Se metto la stampa "OUTPUT = $ output", ottengo OUTPUT =

+0

forse è una sorta di discrepanza della piattaforma. Sicuramente non stampa per stdout per me, e la risposta che ho controllato ha risolto il problema. –

3

Nella shell 2> mezzi reindirizzare fileno 2. Fileno 2 è sempre quello che un programma vede come stderr. Allo stesso modo, il fileno 0 è stdin e il fileno 1 è stdout. Quindi, quando dici 2>&1 stai dicendo alla shell di reindirizzare stderr (fileno 2) in stdout (fileno 1). Dal momento che l'operatore backticks usa la shell per eseguire il comando specificato, è possibile utilizzare il reindirizzamento shell, in modo

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

è raccontare ricciolo per reindirizzare l'output in stdout, e dal momento che l'operatore backtick cattura stdout, si ottiene quello che stavi cercando.

+0

grazie ... la tua spiegazione è formulata in modo molto più superficiale di quella che ho scelto come risposta corretta, quindi, gli sto dando un ingrandimento :) –

4

Che cosa vuoi veramente fare? Utilizzare curl a tutti i costi o afferrare il contenuto di una pagina Web?

Un modo più la Perl di fare questo (che si basa su nessun programmi esterni che possono o non possono essere installati sulla macchina successiva in cui è necessario fare questo) sarebbe:

use LWP::Simple; 

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

Se si desidera scopri perché il GET ha fallito, o prendi più pagine dallo stesso sito, dovrai usare un po 'più di macchinari. perldoc lwpcook ti aiuterà a iniziare.

+1

grazie! è molto utile –

0

È possibile 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; 
Problemi correlati