open(IN, '***');の中に?を使うには?

[上に] [前に] [次に]
ジェリー [HomePage] 2000/02/14(月) 18:53:23
こんにちわ、open(IN, '***.cgi');の中に?を使いたいのですが、うまくいきません。
以下のようにしたいのです。
open(IN, '***.cgi?+++');
よろしくお願いいたします。

EMI 2000/02/14(月) 19:07:39
CGIを起動したいんですよね?
openじゃ、起動できませんよ。

ジェリー 2000/02/14(月) 19:09:12
CGIの画像(カウンタ)を表示したいのです。
何で起動できますか?

zizz... [HomePage] 2000/02/14(月) 19:10:30
うまくいかないときは、具体的な症状を書いておくと、無駄なやり取りが減らせて良い。

'?' を使ってどうするの?
HTTPで GET するときにつけるものでしょう。
ローカルなファイルを開くときにつけるものではない。
仕組みがわかっていないのでは?

ジェリー 2000/02/14(月) 19:12:07
***.cgi?+++をつけると画像が表示できるインターフェースなのです。

EMI 2000/02/14(月) 19:21:06
いずれにせよ、openじゃ絶対にCGIは実行できません。

まぁ、でもふと思いついた、冗談のようなゴミスクリプト。

open(IN, '***.cgi');
while(<IN>){
  eval{$_);
}

まぁ、まともに動かないだろうけど。:-P

EMI 2000/02/14(月) 19:22:38
冗談のようなゴミスクリプトだけど、間違ってたので一応訂正。

>  eval{$_);
  eval($_);

ジェリー 2000/02/14(月) 19:32:39
CGIの実行時にエラーが発生しました。

EMI 2000/02/14(月) 19:39:05
だから、具体的な症状を書いてください。
どんな方法で実行しようとしたら、どんなエラーが出たんですか?
まさか、まだopenで実行しようとしてるわけじゃないですよね?

ちなみに、上のゴミスクリプトは、ほんとに試す価値もないゴミなので、試さなくていいです。

ジェリー 2000/02/14(月) 19:50:34
こんにちわ。

open(IN, '***.cgi');
while(<IN>){
  eval($_);
}
をやったらエラーが出ました。
openだと、画像が表示されません。

以上

zizz... [HomePage] 2000/02/14(月) 19:56:05
何時ものことだが、あまりにも情報が少ないので書きにくい。
チャット状態でまずいような気もする。

プログラムをCGIとして使うときは、Web Serverに実行してもらう。
普通はHTMLの出力で、
<IMG SRC="カウンタの場所">
など書いて、改めてブラウザから要求を出してもらう。

基本的な部分が全然わかっていないように見える。
ここで聞いても付け焼刃なので、本でも読んで勉強したほうが良いだろう、と忠告しておく。

ジェリー 2000/02/14(月) 19:57:49
それはわかるのですが(^^;;
CGIの方から直接CGIを実行できませんか?
ということです。

toshi [E-Mail] [HomePage] 2000/02/14(月) 20:38:51
> それはわかるのですが(^^;;
> CGIの方から直接CGIを実行できませんか?
いまいちよく分からないのですが...

ところでCGIの画像(カウンタ)はどうやってブラウザに送るつもりなの?

ジェリー 2000/02/14(月) 20:44:17
CGI(カウンタ)→CGI→ページ→ブラウザ
というところでしょうか

zizz... [HomePage] 2000/02/14(月) 20:52:56
> CGI(カウンタ)→CGI→ページ→ブラウザ
Web Serverからプログラムを呼び出すのならCGIと言えるが、
そうでないプログラムから別のプログラムを呼び出すのじゃ、CGIとは言えないのでは?

カウンタプログラムからの出力画像を、HTMLをかえすCGIで吐き出すとなると、
HTML出力に画像が混ざることになる。わかってる?

> それはわかるのですが(^^;;
何がわかったの?

B-Cus 2000/02/14(月) 20:55:56
やれやれ。

そもそもコマンドを実行して、その結果を取得したいなら
 open(IN,"command |");
とする。`|' ね。

で、counter.cgi が GET で引数を取得してるなら、
環境変数 QUERY_STRING を設定してから実行。
 $ENV{QUERY_STRING}='foo=1&bar=2';
 open(IN,'counter.cgi |');
 print <IN>;

あるいは ARGV を見てるなら、普通に引数を書いて実行。
 open(IN,'counter.cgi foo=1 bar=2|');
 print <IN>;

toshi [HomePage] 2000/02/14(月) 21:05:49
いまいちそっちのやりたいことが伝わってこない...

> CGI(カウンタ)→CGI→ページ→ブラウザ
なぜこんなこと(CGI(カウンタ)→CGI)をするの?
どういうメリットがあるのですか?
直接CGIに print "<img src='***.cgi?+++'>; 見たいな感じで書き込めばいいのでは?

ふじ 2000/02/14(月) 21:11:00
> CGIの方から直接CGIを実行できませんか?
CGI から、(本来はCGIとしてWebサーバ経由で起動されるスクリプトを
Webサーバを通さずに)実行したい、ってことですか。

まず確認ですが、
呼び出されるカウンタプログラムは、呼び出すCGIと同一サーバにありますか?

同一サーバにあれば(かつ、それなりのパーミッションがあれば)、
open (IN, "/hoge/fuga/counter.cgi |");
とすれば、カウンタスクリプトの出力結果を標準入力から
読み込むことが出来ます。
# そのままだと、Content-Type ヘッダが付いているのに注意。

呼び出されたカウンタCGI (厳密にはCGIとはいわない。Webサーバから起動されないから)
は、環境変数 QUERY_STRING を見て、引数を取り出しているでしょうから、
環境変数をセットした上で open すれば良いのでは。

$ENV{'QUERY_STRING'} = "hoge=fuga";
open (IN, "/hoge/fuga/counter.cgi |");
binmode IN;
while(<IN>){ $buf .= $_ };


別サーバにある場合は簡単ではなくて、呼び出し元のCGIで
ソケットなり LWP 等のモジュールなり、 wget 等の外部ツールを
つかって、データを取得する必要があります。
この場合は、open では不可能です。

# 要するに、呼び出し元のCGIが(ブラウザのように)別サーバにアクセスして
# データを取ってこなくてはいけない。

ジェリー [HomePage] 2000/02/14(月) 21:34:11
[[解決]]
なるほど。
たくさんのご意見、
ありがとうございました。
色々試してみます。

では。

zizz... [HomePage] 2000/02/14(月) 22:02:59
私は頭が悪くて、何がどう解決したのかさっぱりわからないのですが、説明していただけないでしょうか?

toshi [HomePage] 2000/02/14(月) 23:38:24
> 私は頭が悪くて、何がどう解決したのかさっぱりわからないのですが、説明していただけないでしょうか?
僕も知りたいです。
具体的に書いてくれると嬉しいです。
ちゃんと書かないとログのためになりませんし...(^^;

toshi [HomePage] 2000/02/14(月) 23:39:01
> 私は頭が悪くて、何がどう解決したのかさっぱりわからないのですが、説明していただけないでしょうか?
僕も知りたいです。
具体的に書いてくれると嬉しいです。
ちゃんと書かないとログのためになりませんし...(^^;

toshi [HomePage] 2000/02/14(月) 23:39:41
ごめんなさい。再読み込みしてしまいました。

とほほ 2000/02/15(火) 00:45:11
> ちなみに、上のゴミスクリプトは、ほんとに試す価値もないゴミなので、
> 試さなくていいです。
たまに、誤ったスクリプトを回答してしまうのは仕方ないことですが、
極力正しいものをお願いしますね。
本人が試す価値も無いスクリプトと呼ぶものを数千人の人に読ませるのは
ちょっと考え物です。

> なぜこんなこと(CGI(カウンタ)→CGI)をするの?
> どういうメリットがあるのですか?
人様作成のCGIカウンタはプログラムが複雑なので改造するのが恐い、
でも、詳細ログの採集など、ちょっと機能を追加したい・・・なんて
時にこんなことするかも・・・

「人を問い詰めるような発言」は控えてくださいね。

ジェリーさんへ。
CGIスクリプトが同じサーバー上にあるなら、B-Cusさんやふじさんの
方法を試してみてください。
CGIスクリプトが別のサーバー上にあるなら、下記の例で外部のURLの
中身を取得することができますので、お試しください。
http://www.tohoho-web.com/wwwperl2.htm#socket

ジェリー 2000/02/17(木) 06:12:26
こんにちわ。
ご回答ありがとうございます。
その後、ふじさんとB-Cusさんの方法で試しました。(サーバーが同じなので)
しかし、B-Cusさんのスクリプトは「Unrecognized character \201 at count.cgi line 21. 」CGIエラーです。

ふじさんの方法はそのままでは「= +++」と表示され、$ENV{'QUERY_STRING'} = "+++";を消すと表示されません。(エラーにはなりません)

$ENV{'QUERY_STRING'} = "+++";

よろしくお願いいたします。

ジェリー 2000/02/17(木) 06:15:20
すみません。

> ふじさんの方法はそのままでは「= +++」と表示され、

は、「+++ =(改行)」となります。

B-Cus 2000/02/17(木) 06:23:55
先は長そうですな。

> 「Unrecognized character \201 at count.cgi line 21. 」
全角空白は半角空白に直してね。

> ふじさんの方法
 - 実際に $ENV{'QUERY_STRING'} = '(この部分)' に何と書いたのか
  本当に "+++" と書いたのか、"+++" はただの例なのか。
 - CGI 経由で実行したカウンタの仕様 (普通はどうやって実行する
  ものなのか。counter.cgi?foo=bar の部分)
 - 実際に作成した CGI スクリプトの全ソース
などがわからないとなんとも。

ジェリー 2000/02/17(木) 06:41:59
こんにちわ。
すばやいご回答ありがとうございます。

B-Cusさんの上のほうのご回答を半角スペースにしたら作動しましたが、「+++ =」になります。

open(IN,'counter.cgi +++|');
print <IN>;

表示させようとしているものは
http://www.kent-web.com/count/dayx.html
です。

B-Cus 2000/02/17(木) 06:56:14
http://www.kent-web.com/count/dayx.html の CGI は、
引数を環境変数 QUERY_STRING から取得していますので、
> あるいは ARGV を見てるなら
こっちじゃなくて、
> $ENV{QUERY_STRING}='foo=1&bar=2';
> open(IN,'counter.cgi |');
> print <IN>;
こっち。

普段カウンタを使うときに <img src=".../dayx.cgi?today"> としているなら
   $ENV{QUERY_STRING}='today';
   open(IN,'counter.cgi |');
   print <IN>;
と書きます。

> 「+++ =」になります
はて。+++ = と出力されるんですか? カウンタ自体は
ちゃんと動いているんですか?

# さっきから http://www.saposen.com/index.html を読んでたんで、
# 少し我慢強くなったような気がする (笑)

ジェリー 2000/02/17(木) 07:07:43
その方法でもやはり、
---ここから---
gif =

---ここまで---
と表示されてしまいます。

カウンタ自体は極めて正常です。

参照中:http://www.saposen.com/index.html

B-Cus 2000/02/17(木) 07:32:50
#!/usr/local/bin/perl
$ENV{QUERY_STRING}='today';
open(IN,"./dayx.cgi |");
print <IN>;
だけでできましたけどね。

何か余分な処理を書いてるんでないの?

ジェリー 2000/02/17(木) 07:40:44
[[解決]]
こんにちわ。

あっ本当です。

print "Content-type: image/gif\n\n";
とその他空白を消したら作動しました。

ありがとうございました。

B-Cus 2000/02/17(木) 07:51:42
だから
> - 実際に作成した CGI スクリプトの全ソース
を見せろ、って書いたんじゃん。

結局こっちに dayx をインストールして確かめるはめに
なってしまいました (俺も暇だね)。質問者が横着をして
必要な情報を出さず、その分 回答者が苦労する、という
いい例ですな。

> 参照中:http://www.saposen.com/index.html
何か学べましたか?

そこに載ってる
 サポート: 「〜はどうなってますか? 確認して下さい」
 客: 「知らん。とにかく動かん」
というのは、まるで ここの回答者とあなたとのやりとりのようですね。

wosamu 2000/02/17(木) 10:00:17
気持ちは非常によくわかりますけど
そういういい方はやめたほうが良いと思いますよ。
とほほさんに迷惑がかかりますし、何より無駄です。

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