backticsを使用してcurlを呼び出す場合、curlの出力をPerlの変数に取得するにはどうすればよいですか?

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

  •  06-07-2019
  •  | 
  •  

質問

perlの変数にcurl呼び出しの応答を取得しようとしています。

my $foo = `curl yadd yadda`;

print $foo;

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

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

役に立ちましたか?

解決

おそらく、その内容をstderrに送信します。お試しください

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

他のヒント

本当にやりたいことは何ですか?どうしても curl を使用しますか、それともWebページのコンテンツを取得しますか?

これを行うためのより完璧な方法(これを行う必要がある次のマシンにインストールされているかどうかに関係なく、外部プログラムに依存しません):

use LWP::Simple;

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

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

シェルでは、 2> はfileno 2をリダイレクトすることを意味します。fileno2は常にプログラムがstderrとして認識するものです。同様に、fileno 0は標準入力、fileno 1は標準出力です。したがって、 2>& 1 と言うと、stderr(fileno 2)をstdout(fileno 1)にリダイレクトするようシェルに指示しています。 backticks演算子はシェルを使用して指定したコマンドを実行するため、シェルのリダイレクトを使用できます

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

は、その出力をstdoutにリダイレクトするようにcurlに指示しています。バックティック演算子はstdoutをキャッチするため、探しているものを取得できます。

これを試してください:

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

curl は、stderrの進捗情報を表示し、それを/ dev / nullにリダイレクトすることで、何が起こっているかを簡単に確認できます。

これは私のシステムで動作します:

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

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

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

キャプチャしたい出力の一部が標準出力ではなく標準エラーである可能性があります。これを試してください:

my $foo = system "curl http://www.stackoverflow.com";
print $foo;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top