2009-06-18 9 views
7

私はcurl呼び出しの応答をperlの変数に入れようとしています。私がbackticsを使って呼び出すと、curlの出力をPerlの変数にどのように出力できますか?

my $foo = `curl yadd yadda`; 

print $foo; 

は機能しません。これをコマンドラインで実行すると、curl呼び出しはすべての出力をターミナルで正しく出力しますが、変数はそのデータでいっぱいになりません。

Perl curl libをインストールして呼び出すことなくこれを行う方法はありますか?

答えて

12

おそらく、そのデータをstderrに送信します。

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

それでした!ありがとう! 2>&1が実際に何をしているのか、それをstderrから何に&1を変数にダンプするのかについて文を加えることができるなら、チェックマークを付けます。 ありがとうございました! –

+1

2> fooは "stderrをファイルfooにリダイレクトする"ことを意味します。 &1はstdoutを意味します。つまり、stderrをstdoutにリダイレクトします。それ以外の方法でも行うことができます: ">&2"は "標準出力への標準出力のリダイレクト"を意味します。 ">&1"という表記は、ファイルディスクリプタ1(stdout)と同じ場所にファイルディスクリプタ2(stderr)が送信されたことを意味します。stdoutとstderrの両方をリダイレクトするには、 ">&"、つまりfoocommand&> file_with_boththings.txtを使用できます。 – sunny256

+0

' )が送信されます。したがって、標準出力と標準エラーの両方が同じ場所(標準出力)に書き込まれます。そして、Perlのバッククォートは、実行されたコマンドの標準出力をキャプチャします。したがって、... –

0

はこれを試してみてください試してみてください:

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

curlディスプレイはそれが簡単に起こっているのかを確認することができますは/ dev/nullにそれをリダイレクトし、標準エラー出力に情報を進行します。

-1

キャプチャしたい出力の一部が標準出力ではなく標準出力である可能性があります。

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

これはあなたが思っていることをしません。 – Geo

0

これが私のシステム上で動作します::このお試しください2>手段シェルで

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

など

+0

私はあなたがそこにあるprintステートメントのカールの印刷を誤解しているかもしれないと思います。代わりに "OUTPUT = $ output"を印刷して、正しい結果が得られるかどうか確認してください。私もそれを行い、カール出力を印刷して、 "OUTPT ="という結果を出力しなかったので、それを印刷します。しかし、上記の答えは正しいです。 –

+0

@ Dr.Dredel printステートメントを削除すると、カールがstderrに出力されますが、curlの出力は表示されません。 "OUTPUT = $ output"という印字をすると、OUTPUT = <!DOCTYPE ...などとなるので、何を言っているのか分かりません。 curlのマニュアルページは明示的です:デフォルトでは、stdoutに出力し、Perlでその出力をキャプチャします。 –

+0

おそらくそれは何らかのプラットフォームの不一致です。確かに私のためにstdoutには印刷されません。私がチェックした答えは問題を解決しました。 –

3

はFILENO 2. FILENO 2は、プログラムが標準エラー出力として見ているものは常にあるリダイレクト。同様に、fileno 0はstdinであり、fileno 1はstdoutです。したがって、2>&1と言うときは、stderr(fileno 2)をstdout(fileno 1)にリダイレクトするようにシェルに指示しています。バッククォート演算子は、指定したコマンドを実行するシェルを使用しているので、あなたは、シェルのリダイレクトを使用することができますので、

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

は、標準出力への出力をリダイレクトするようにカール語っている、とバッククォート演算子はSTDOUTキャッチするので、あなたは何を得ますあなたが探していた

+0

ありがとう...あなたの説明は、私が正しい答えとして選んだものよりも、より良い言葉になっています。だから、私はそれを上向きにしています:) –

4

本当に何をしたいですか?すべての費用をcurlで取得するか、Webページのコンテンツを取得しますか? (またはあなたがこれを行うために必要な次のマシンにインストールしてもしなくてもよいがない外部のプログラムに依存している)これを行うの

もっとPerl的な方法は、次のようになります。

use LWP::Simple; 

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

あなたがしたい場合はなぜGETが失敗したのか、同じサイトから複数のページを取得する場合は、もう少し機械を使用する必要があります。 perldoc lwpcookが始まります。

+1

ありがとう!それはとても便利です。 –

0

パイプをファイルのように開くことができます。

$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; 
関連する問題