CGI環境変数をすべて取得することはできますか?

[上に] [前に] [次に]
びぎなー 2000/01/08(土) 02:11:12
Perlの環境変数って何種類ぐらいあるのかな?と思って,

print "<TABLE BORDER>\n<TR>\n";
print "<TD align=center><B>key</B><TD align=center><B>value</B>\n";

foreach $key (sort keys %ENV) {
print "<TR>\n";
print "<TD>$key<TD>$ENV{$key}\n";
}

print "</TABLE>\n";

というスクリプトを作ったのですが,
プロキシを通したときとそうでないときでは
得られる値(の数)が違いました。

ハッシュ%ENVの要素$ENV{$key}が空でもkeyだけは取得できると思ったんですが・・・
つまり

・・・
<TD>HTTP_COOKIE<TD>(空)
<TD>HTTP_USER_AGENT<TD>Mozilla/4.0[ja] (win95; I)
・・・

という表示を期待していたんです。
なにが間違ってるんでしょう?
このスクリプト? 環境変数の意味? 両方?

別に自分のHPで利用しようというわけではなく,
ただの興味でやってるんですけど・・・(^^;

\n 2000/01/08(土) 02:48:59
テキスト形式ですがご自由に改造して下さい。

#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";

foreach (sort(keys %ENV)){
        print "$_ = $ENV{$_}\n";
}

びぎなー 2000/01/08(土) 03:17:55
\nさんありがとうございます。
この方法を試してみたいと思います。今日はもう眠いので明日。(^^;

私の記述のどこが悪かったのか
指摘していただけたらありがたいのですが。

\n 2000/01/08(土) 04:06:22
あっ早とちりしていましたね。

なるほどスクリプトそのものはおかしくないです。
環境変数は値が無くとも設定されるものや、値がある時だけ設定
されるものがあるようです。

QUERY_STRING は値が無くともキーはあるのに HTTP_COOKIE など
はブラウザがクッキーを送出した時だけセットされるようです。

mm 2000/01/08(土) 04:08:26
>ハッシュ%ENVの要素$ENV{$key}が空でもkeyだけは取得できると思ったんですが・・・
これは間違ってません。

>という表示を期待していたんです。
これが間違ってます。

>得られる値(の数)が違いました。
これは、普通そうなります。

mm 2000/01/08(土) 04:15:16
あっ、カブっちゃってる。失礼しました>\nさん

ひゅどる 2000/01/08(土) 05:14:29
さらに書くと。

環境変数のうち、"HTTP_"で始まるものはクライアント(ブラウザ)が持ってくるものです。
ですので、例えば
X-Hoge:(空)
というHTTPヘッダを送ってやると、
<TD>HTTP_X_HOGE<TD>(空)
という結果になります。

HTTP_COOKIEを取得できなかったのは、ブラウザが Cookie:ヘッダを送信していなかったからなのです。

びぎなー 2000/01/08(土) 16:59:36
\nさん,mmさん,ひゅどるさんありがとうございます。m(__)m

環境変数のキーはもともとPerlが容易してくれていると勘違いしていました。

keyもvalueも両方与えてやらなければ%ENVの中にははいらないんですね?

ってこの考え方であっているのでしょうか?

自分での半信半疑なので解決できません。
もしあってるのなら,だれか代わりに解決をチェックして
いただけませんか?違ってても訂正して解決しちゃってください。(^^;
自分で解決を押さないのはやはり迷惑でしょうか?もしそうならいってください。

きたむら 2000/01/08(土) 20:11:00
>keyもvalueも両方与えてやらなければ%ENVの中にははいらないんですね?

そのとおりです。
誰が与えるかというと、Perlを起動する親プロセスで、この場合はWebサーバーですね。

>自分で解決を押さないのはやはり迷惑でしょうか?もしそうならいってください。
いえ迷惑なんて思いませんが、やはり、びぎなーさん本人が解決チェックつけてくれるとスッキリします。

きたむら 2000/01/08(土) 20:19:19
上を書いてから、念のため
% man environ
を見たら、環境変数は「習慣によって"name=value"という形をとります」と書いてありました。あるいはvalueの無い環境変数が使われる場合もあるのかもしれません。
でもまあ一般には、%ENVのkeyとvalueはペアで設定される(もちろんvalueが空文字列というのはアリ)と思って間違いないと思います。

びぎなー 2000/01/09(日) 08:31:04
[[解決]]
きたむらさん ありがとうございます。

無事問題を解決することができました。
>>自分で解決を押さないのはやはり迷惑でしょうか?もしそうならいってください。
>いえ迷惑なんて思いませんが、やはり、びぎなーさん本人が解決チェックつけてくれるとスッキリします。
ただ「ありがとうございます。」と書くだけなのに追加発言によって
解決したスレッドをラウンジの一番上へいってしまうことに気が引けたので,
こうしたらどうかと考えたんです。
正直,怒られたりするかなと心配していました。(^^;

みなさん本当にありがとうございました。

[上に] [前に] [次に]