親cgiから子cgiをコールする方法

このQ&Aのポイント
  • パラメーターを与え、親cgiから子cgiをコールする方法について説明します。
  • 親cgiはパラメータを子cgiに渡すだけで、子cgiは単純に結果を親cgiに返します。
  • 親cgiと子cgiの関係を整理し、頻繁に変更される条件を子cgiだけで修正できるようにします。
回答を見る
  • ベストアンサー

cgiからcgiをコールする。

お世話になります。 以下のようなことを考えています。 パラメーターを与え、そのパラメーターを「在る条件」で加工してファイルに出力していますが、 この「在る条件」が、結構頻繁に変更されます。 上記処理が1カ所なら条件が変更される都度直せば宜しいのですが、 パラメーターを与えるまでの違いのため、似たようなロジックですが複数本存在します。 a.cgi b.cgi c.cgi d.cgi,,,,と。 (それぞれ前段が少しずつ違いますが、パラメータを渡すところからは同じです) ということから、これらを親と子に分け、 パラメーターを渡すまでを親cgi、パラメーターを貰って加工しファイルに出力する部分を子cgiにすれば、 頻繁に基準が変わる「在る条件」を直すのは子cgiだけで済む、と考えます。 a.cgi コール x.cgi b.cgi コール x.cgi c.cgi コール x.cgi d.cgi コール x.cgi,,,,のように。 教えていただきたいのは、 親(a.cgi b.cg c.cgi,,,)から子(x.cgi)をコールする部分のコーディングです。 (親はパラメータを与えて子をコールするだけ、  子はファイルを出力するだけで親に結果を返すなどの処理は不要です、単純に戻るだけで構いません。) 実際の例を挙げていただければ嬉しいです。 宜しくお願いします。

  • Perl
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • hok212
  • ベストアンサー率66% (100/150)
回答No.1

一番お手軽な方法は require を使う方法ではないでしょうか。 例:呼び出し元のCGIからファイル名とテキストを渡し、require で読み込まれるライブラリでabc.txtを生成し、その中身にtestと書き込むスクリプト ##### 呼び出し元(a.cgi) require "x.pl"; &makeFile("abc.txt","test"); ##### require で読み込まれるライブラリ(x.pl) sub makeFile { $file = $_[0]; $writeText = $_[1]; open(FH,">$file"); print FH $writeText; close(FH); } 1; なお、requireで読み込むライブラリは、最終行で真を返す必要があるので 1 を記述します。

nagahaha
質問者

お礼

早速有り難うございました。 教えていただいたモノに少しばかり私のロジックを加え、 やってみました。 私のローカル(perl環境)では思った通りの結果が出て出来ました。 喜んで、使わせて貰っているinfoseekライト(無料のレンタルサーバー)に登録したところ、 500番のエラーが出ました。 このサーバーではこのやり方を認めていないのでしょうか。 もしそうだと諦めないといけないのですね。 宜しくお願いします。

その他の回答 (1)

  • hok212
  • ベストアンサー率66% (100/150)
回答No.2

> infoseekライト(無料のレンタルサーバー)に登録したところ、 > 500番のエラーが出ました。 infoseekのサーバは使ったことがないのですが、require はごくごく一般的な手法ですので、Perlが使えるサーバであれば普通ではありえないことです。 呼び出し元のCGIから require している行、及びサブルーチンを呼び出している行をコメントアウトするとどうなりますか? これでエラーが出ないなら、require で読み込まれるファイルのほうに問題があります。 実は単純ミスで、FTP時にバイナリで転送しているのかもしれません。

nagahaha
質問者

お礼

またまた有り難うございました。 問題なく動くはず、 との勇気づけられるお言葉を頂いたので全てを見直しました。 というより、テストロジックだけを作ってやっていたので、 本番さながらに今回教えていただいた部分を加味、 本番で動かしてみました。 結果は全く問題なく、動きました。 テストのために分からないながら端折ったりした部分が影響していたのかなと思っています。 ということで、 これから同じロジックをコピーして全ての親に反映する力作業だけになり、先が見えました。 大変お世話になり有り難うございました。

関連するQ&A

  • CGIで他のCGIの出力を取り込む方法について。

    CGIで他のCGIを呼び出し、同じページの一部として出力したいと考えています。 例えば、親のCGIが簡単な機能のCGIをページの一部として出力し、 そのパラメーターを子のCGIに受け渡し呼び出すようなしかけです。 なんかうまい方法ありますか?? あまり急いでいませんが、宜しくお願いします。

    • ベストアンサー
    • CGI
  • UWSCでcall関数を連続して使おうとしてエラー

    UWSCの個別の複数のスクリプトを、連続して使用したいと考えています。 CALL関数を使えばいいのかと思って、単純に羅列してみましたが、一個目のスクリプトの終了以降進行しません。 call A.uws call B.uws call C.uws call D.uws という具合です。 (実際には、○.uwsという形ではなく ”” で囲ったフルパスです) Aが終わると、それで終了してしまいます。 仮にAの部分をコメントアウトすると、Bが始まって、Bで終了です。 本来希望しているのは、Aが終わるとBが始まり、Bが終わるとCが・・・・、 という形で順番に処理を進行してほしいです。 もしかして、矢継ぎ早に連続でABCDと重なって処理しているのでしょうか。 原因と対処方法をどうぞ教えてください。よろしくお願いします。

  • CGIから別サーバーのCGIの呼び出し

    以下の二つのサーバーでCGIを動作させようと考えています。  サーバーA:ユーザーからアクセスできる。  サーバーB:サーバーAからアクセスでき、ユーザーからはアクセスできない。 この環境で (1)サーバーAでリクエストを受け、簡単な処理をする。 (2)サーバーA上のCGIからサーバーB上のCGIを呼び出す。 (3)サーバーB上で処理(etc. メールの送信)を行い、処理結果をサーバーAのCGIに返す。 (4)サーバーA上で簡単な処理を行い、結果をユーザーに表示する というような処理を考えています。 perlでは、このような処理を実装することは可能でしょうか? サーバーAからサーバーBにあるスクリプトファイルを読み込んで、サーバーAで実行するということはできそうなのですが、サーバーB上のCGIはサーバーBで実行するというようなことができるのかがわかりません。 初心者的な質問で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • a.cgi経由で、b.cgi実行

    a.cgiからLOCATIONで、b.cgiを実行したいのですが、 1つ条件がありまして、b.cgiを実行する場合は必ず a.cgi経由出なければいけないというチェックをしたいのです。 LOCATIONを使用した場合、環境変数「HTTP_REFERER」に値がセットされないみたいなのでNGでした。 またパラメータを持たせるにしても、LOCATIONはGETしか使えないので、アドレスを見ればばればれになってしまいNGです。 何かいい方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Ruby CGI パラメータ

    rubyでCGIのパラメータを一つの変数に&でつないで格納したいです。 (パラメータなしの場合は""にしたい。) ex1) hoge.cgi →para=>"" ex2) hoge.cgi?a=1 →para=>"a=1" ex3 hoge.cgi?a=1&b=2 →para=>"a=1&b=2" どう書いたらよいでしょうか?

  • CGIで内部処理を待たずにレスポンスを返す方法

    ■質問 CGIで内部処理を待たずにレスポンスを返す方法について教示願います。 (関連サイトを調べていて、近しいものはあったのですが、なかなか今回の問題の原因と対処に結びつく有効な手がかりがない、苦慮しています。) ■詳細 <動作環境>  (1)画面(Java)→(2)Web(Apache)HTTPリクエスト→(3)CGI(C言語)  (3)→(2)を介して(1)へHTTPレスポンスを送信 この環境下で、(3)の中で(3)’処理((2)へのレスポンスとは非同期で 別処理(DBへ登録する処理)言語:cshをCの中からシステムコール。 cshの中でperl処理をキックし、DB更新)を今回追加しました。 (3)’を待たずに(1)へのHTTPレスポンスを返却したいのですが、 サーバログ((1)、(2))をみると、返却のタイムスタンプを見ると、 (3)’が完了した後に返却されているようです。 方式的に(3)の中でfolkを使用し、子プロセス化することで 親は子の処理((3)’)を待たずに(2)にレスポンスを返却可能とみておりましたが、そもそもCGI(C言語)ではできないものなのでしょうか? →C(親処理)の中にデバックを仕掛けたところ、親の終了後に子が動いているように見えています。 ■ソース(概要)※詳細(原本抜粋)が必要な場合は申しつけください。  IF文で定義  (1)forkで子の場合、    execlでcshを実行(cshには親でもらった引数を設定)  (2)親の場合、   デバックログファイルをクローズし、処理終了。 ■補足(その他気になっている点)  ・上記ソースでは、(1)の中では、親で使うログファイル出力   のcloseを行わず、処理終了していますが、問題ないか?  ・同(2)のとき、perlCGIでは、close(stdout);を明示しないと   HTTPレスポンスが返却されない(子の終了を待ってしまう)   旨、サイトの情報に記載がありましたが、C CGIでも同様に   何かしらの明示をしないと、待たされるのか? 以上です。

    • ベストアンサー
    • CGI
  • 暗号・復号 cgiスクリプトについて

    こんにちは。 私はcgiスクリプトにて文字を暗号化させたいと思っています。 友人に暗号化復号化スクリプトを書いてもらったのですが どうやって動かすかよくわかりません。 http://www.rescue.ne.jp/cgi/htpasswd/makepwd-des/ 上記のサイトのように出力させたいのですが、スクリプトだけでは私には難しいです。 その友人は海外に行ってしまい連絡が今は取れないんです。 sub enc_string{ my ($key, $string) = @_; my @map = (('A' ... 'Z'), ('a' ... 'z'), ('0' ... '9'), '+', '&'); my @key = unpack('C*', $key); my $str = ''; my @x = map { int(rand(200)) } (0 ... 2); @key = map {$x[$_] ^ $key[$_]} (0 ... 2); while($string ne ''){ my $n = substr($string, 0, 3, ''); my @n = unpack('C3', $n); map{$n[$_] ^= ($key[$_])} (0 ... 2); @key = unpack('C3', $n); @key = map {$x[$_] ^ $key[$_]} (0 ... 2); my $a = $n[0] >> 2; my $b = (($n[0] & 3) << 4) | ($n[1] >> 4); my $c = (($n[1] & 15) << 2) | ($n[2] >> 6); my $d = $n[2] & 63; $str .= $map[$a] . $map[$b] . $map[$c] . $map[$d]; } my $a = $x[0] >> 2; my $b = (($x[0] & 3) << 4) | ($x[1] >> 4); my $c = (($x[1] & 15) << 2) | ($x[2] >> 6); my $d = $x[2] & 63; return $str.'<>'.$map[$a].$map[$b].$map[$c].$map[$d]; } このスクリプトで暗号するようですが、初心者なものでどうやって 手直し?追加すればよいのでしょうか? #!/usr/bin/perlを最初に入れるのはわかります。 あとこのスクリプトの他に復号、MD5にて暗号のスクリプトがあります。 まずは暗号化させてみたいのですが、よろしくお願いします

  • データの選択

    csvファイルから、特定の条件を持つ行を抽出したいです。 a1, b1, c1, d1, e1 a2, b2, c2, d2, e2 a3, b3 ,c3, d3, e3 :   :   :   :  : an, bn, cn, dn, en とあったときに d-c/d+c > 0.5となる行だけを出力したいのですが file.each{|line| x = line.split(",").map{|i|i.to_i} if 0.5<(x[3]-x[2])/(x[3]+x[2]) p x end } と自分でやってみたものの、出来ませんでした。 どうしたらよいのでしょうか。

    • ベストアンサー
    • Ruby
  • Callで呼び出し後にそのCallで例外が発生

    例えば、下記のCallでプロシージャProc1を実行した後に、そのCallで例外(HRESULT からの例例:0x800A01B6)が発生します。 Call Proc1(a, b, c) デバッグモードでこのCallにストップをかけ実行します。停止した後に1ステップごとに実行を進めるとと、Proc1が正常に終了した後、このCallで例外が発生したと報告されます。 環境は、Windows 7、VB 2010 Express、IE 11です。 何が起こっているのでしょうか?

  • cgiでの並べ替えについて

    フォームを使用して書き込みされたログファイルを並べ替えしているんですが、意図しない動きをするんです。 ログデータは以下のような感じです。 a=***&b=***&c=***&d=***&e=*** #-----並べ替えを行う open (FILE2,"<naisen.log"); flock(FILE2,2); @log2 = <FILE2>; flock(FILES,8); close FILES; @sort2 = sort {(split(/[&=]/,$a))[7] <=> (split(/[&=]/,$b))[7];} @log2; @sort3 = sort{(split(/[&=]/,$a))[5] cmp (split(/[&=]/,$b))[5];}@sort2; open (FILE2,">naisen.log"); flock (FILE,2); @filew = @sort3; print FILE2 @filew; close(FILE2); a=***&b=***&c=***&d=120 a=***&b=***&c=***&d=111 というデータがあった場合、意図している動きは a=***&b=***&c=***&d=111 a=***&b=***&c=***&d=120 という順番に並べ替えられるものですが、 a=***&b=***&c=***&d=120 a=***&b=***&c=***&d=111 です。 なぜ111の方が下にきてしまっているのでしょうか? また全部ではなく一部だけに並べ替えが適用されないのはナゼでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう