• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cgi間における値受け渡しについて)

cgi間の値受け渡しについて

このQ&Aのポイント
  • 現在、perlでcgi作成の練習を行っているが、値受け渡しについて困っている。
  • a.cgiの変数$numの値をb.cgiで表示させたい。
  • 開発環境はUbuntu 10.10、corei5、Perl v5.10.1、geditを使用している。

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

> C言語の関数の様に,「他の関数に値を渡すことはできるのでは?」という思い込みから生まれた質問でした. 起動プロセスが異なるので関数というのはまた概念が異なっていますが、前回答で書きました【仮に】というところで説明した方法をかなりアクロバティックなやり方で実現することは可能です。 具体的なやり方としては「a.cgi」にWebブラウザを偽装させて同Webサーバの「b.cgi」をアクセスして起動し結果を得て、「a.cgi」側で受信した結果をクライアントに戻す際にブラウザ側であたかも「b.cgi」を実行した結果を出しているようにJavaScriptなどでこれも偽装するという方法ですが、こうすることはハック的な色あいが強いので学習以外に実用的なメリットはないと思います。 場数を踏んでゆけばおいおいわかってくることだろうと思います。 > 私は外部CGI読み込みを行うreqguireを用いて, ここでいう「require」はCでいうところの「#include」に該当します。 ただ、これはご存知のように同一プロセス(プログラム)内での処理なので、概念そのものが異なります。 要するにCGIの呼び出しは、1プログラムの実行です。 その処理そのものはサーバ側で行われていて、結果のみがローカル側に伝えられます。 CGIなどのWebプログラミングは、近年ではお手軽に利用できるため敷居が低く感じられますが、通常のプログラミングの要素に「ネットワーク」「インターネット」「HTTP」「サーバ」「クライアント」といった別の専門要素が加わるため、各々の基本的な知識をはしょって理解することは無理があります。 あーすればこうなる的な直感でやってるセンスの良い人もいますが、応用力に限界が浅いのも事実です。 とにかく場数を踏み経験をつんでひとつでも多くの知識を身に付けながらがんばってください。

tanaka5667
質問者

お礼

ご回答ありがとうございます. >前回答で書きました【仮に】というところで説明した方法をかなりアクロバティックなやり方で実現することは可能です。 基本的には,このような処理自体が行えない,行うことは推奨されないと分かり,胸のつかえがなくなりました.「なんとなく出来そうなんだけど・・・」と闇雲にあがいていたのですが,それではやはりダメですね. >CGIなどのWebプログラミングは、近年ではお手軽に利用できるため敷居が低く感じられますが 過去に作成したオフラインプログラムをwebで公開しようと思い,CGIを先週より勉強し始めたのですが,相手となるWEBプログラムの深遠さというものを計り違えてしまったようです.やはり千里の道も一歩から,ということですね.助言して頂いた内容とソースの内容を吟味できるレベルになれるよう,まずは書籍を購入して勉強していきたいと思います.ご丁寧にありがとうございました.非常に助かりました.

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

CGIに関して根幹の部分の理解を端折っていらっしゃる様ですので 「a.cgiにおける変数$numの値を、b.cgi表示したい」という発想が生まれたのだと思うのですが CGIはあくまでも「クライアント(ブラウザ)」から「Webサーバ」への「リクエストによって生じる」ものです。 仮にサーバ側CGIによって発生処理しているプログラムからWebサーバに別のCGIをリクエストしてもクライアント(ブラウザ)からのリクエストではないので返答は呼び出したプログラムに戻るだけでクライアント(ブラウザ)には戻りません。 ここで期待する結果を得るため理解しなければいけないのは、最初に呼び出されたCGI「a.cgi」の処理結果は、いったんクライアント(ブラウザ)側に戻して、クライアント(ブラウザ)から別のCGI「b.cgi」を呼び出すことで値を渡さなければならないということです。 当然、HTMLを表示しただけでは能動的に動作する仕組みなど無いので手動でなければ「b.cgi」は呼び出せないのですが、これを能動的に自動化するならJavaScriptを使って新たな窓を開いて「b.cgi」を呼び出すことになるかと思います。 以下はそのサンプルですが、この手の仕組みはPOPUPをブロックされているとアウトです。 ---------------------------------------------------------------------------- 【form.html】 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>フォームページ</title> </head> <body> <form method="POST" action="./a.cgi"> <p align="center"><input type="text" name="NUM" size="20"></p> <p align="center"><input type="submit" value="倍数計算" name="B1"></p> </form> </body> </html> ---------------------------------------------------------------------------- 【a.cgi】 #!/usr/bin/perl require "./cgi-lib.pl"; ReadParse(); my $num_base = $in{'NUM'}; my $num = $num_base * 2; print <<HTML_BODY; Content-type: text/html\n\n <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>a.cgi</title> <script language="javascript"> <!-- function fCall_B_CGI(){ document.f.submit(); } //--> </script> </head> <body onload="fCall_B_CGI()"> <br /> <p align="center">もとの数:「$num_base」</p> <br /> <!-- B.CGI呼び出し用の隠しフォーム:ここから --> <form method="POST" name="f" action="./b.cgi" target="_blank"> <input type="hidden" name="NUM_A" value="$num"> </form> <!-- B.CGI呼び出し用の隠しフォーム:ここまで --> </body> </html> HTML_BODY exit; ---------------------------------------------------------------------------- 【b.cgi】 #!/usr/bin/perl require "./cgi-lib.pl"; ReadParse(); my $num = $in{'NUM_A'}; print <<HTML_BODY; Content-type: text/html\n\n <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>a.cgi</title> </head> <body> <br /> <p align="center">倍数:「$num」</p> <br /> </body> </html> HTML_BODY exit; ----------------------------------------------------------------------------

tanaka5667
質問者

お礼

To:ralf124c様 ご回答ありがとうございます.仰られるとおり,CGIの基礎部分の構成について学習できておりません.C言語の関数の様に,「他の関数に値を渡すことはできるのでは?」という思い込みから生まれた質問でした. 私は外部CGI読み込みを行うreqguireを用いて, 【a.cgi】 $num = 1; #$numに値を代入 require './b.cgi '; #b.cgiを読み込む. 【b.cgi】 ~何かa.cgiから値を受け取る処理~ print $num; #a.cgiで宣言されている$numを表示 みたいに実現できるのではと勘違いしておりました. ご丁寧に,サンプルコードまで記述して頂きありがとうございます.頂いたコードをじっくりと解析し,勉強したいと思います.

関連するQ&A