Come faccio a ottenere l'output di curl in una variabile in Perl se lo invoco usando backtics?

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

  •  06-07-2019
  •  | 
  •  

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?

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top