2

次の Perl コード スニペットを理解するための助けが必要です。次の2つの質問があります。

1. ローカルとは*PIPERどういう意味ですか? local *構文が私にとって新しいものになる前に、Perl プログラミングをいくつか行ったことがありますが。ポインターですか?

2. 目的は何ですか

curl http://www.somesite.net/cgi-bin/updateuser.cgi? -d "userid=$userid&password=$password\" -s |"; ?

ありがとうございました :)

local *PIPER;

$http_query = "curl http://www.somesite.net/cgi-bin/updateuser.cgi? -d \"userid=$userid&password=$password\" -s |";

open(PIPER,$http_query) or die "sorry";

while(<PIPER>)
{
   $rets = $_;

}

close(PIPER);

return $rets;
4

4 に答える 4

10

1) " *PIPER" は型グロブです。それは、「$PIPER」、「@PIPER」、および「%PIPER」(そして私はいくつか) をすべて 1 つにまとめたものです。*PIPER彼らは、あなたが持っているコード スニペットにローカルなすべての名前を宣言しています。

2)それはシェルコマンドです。これ|は、そのコマンドが実行されていることを意味し、その出力は filehandle の入力としてパイプされていますPIPER。次に、プログラムは を使用してこの行を 1 行ずつ読み取りますwhile(<PIPER>)が、それは既にご存じのとおりです。

についてはよくわかりませんがcurl、インターネット上で何かを行うためのコマンドライン プログラムであることは知っています。あなたのコードは Web サイトの CGI スクリプトにアクセスし、何らかの情報を送信しているように見えます。

于 2009-02-16T07:09:46.577 に答える
6

他の人が指摘したように*PIPER、タイプグロブであるため、PIPER ファイルハンドルを動的にスコープできます。しかし、それは古代のPerlです。代わりにレキシカル ファイルハンドルを使用します。

サブ foo {
    私の $http_query = "...";

    my($piper)、$http_query を開くか、「申し訳ありません」;

    その間()
        {
        $rets = $_;
        }

    $rets を返します。
    }

ただし、サーバーに POST リクエストを送信するためにこれを行う必要はありません。LWPを使用して、Perl 内でこれを完全に行うことができます。

于 2009-02-16T23:08:10.610 に答える
3

local *PIPER;PIPERファイルハンドルがローカルであることを宣言しています。ファイル ハンドルには独自の型シンボルがないため、ローカルとして宣言するには型グロブでキャッチする必要があります。

curlに似ていwgetます。URL の転送に使用されます。詳細については を参照man curlしてください。ただし、-dスイッチ (データ) は POST 操作で次の文字列をデータとして渡し、-sスイッチ (サイレント) はエラー出力と進行状況メーターを抑制します。

于 2009-02-16T07:22:46.280 に答える
1

2) この curl の実際の呼び出しにより、\"userid=$userid&password=$password\" というテキストを含む HTTP POST 要求が http://www.somesite.net/cgi-bin/updateuser.cgiに送信されます。サーバーからの応答を (パイプに) 出力します。-s フラグは、サーバーからのもの (エラー メッセージや進行状況メーターなど) 以外の出力を取り除きます。

于 2009-02-16T07:32:34.430 に答える