- ベストアンサー
Perlソースを2つのファイルに分ける
2つ以上のCGIファイルを使う方法を教えてください。 例えば、 #!/usr/bin/perl (1.cgi) print "Content-type: text/html\n\n"; print '<html><body>'; $t1 = 'abcd'; $t2 = 'EF'; $t1 = &fnc($t1,$t2); sub fnc{ $s1 = @_[0]; $s2 = @_[1]; return $s1.$s2; } print $t1; print '</html>'; このソースの 'abcd' (2.cgi) と $t2 = 'bc'; (3.cgi) と sub fnc{ (4.cgi) $s1 = @_[0]; $s2 = @_[1]; return $s1.$s2; } の3つのタイプを外部ファイルとして、全部で4つのCGIに したいと思っていますが、可能か不可能か、可能であれば それぞれのCGIファイルのソースを教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じ↓ではどうでしょう? [main.pl] require './data.pl'; require './sub.pl'; print $str; &disp($str); exit; [data.pl] $str = 'abc'; [sub.pl] return(1); sub disp { print "[@_]"; return; }
その他の回答 (5)
- chupark
- ベストアンサー率41% (90/218)
.plはPerlの拡張子です。 .cgiはPerlだけとは限りません。 ってこれでは回答にはなってないでしょうか?^^; あの、先にもどうされたいのかが分かりませんと書かせていただいたのは、質問の意味がわかりませんという意図ではなく、teeeyaさんも指摘されているように、どうしてこのソースを分割したいのでしょうかという意図をこめてのことで書かせていただきました。 そして、思うのですが、2.cgiなどはcgiでなくても、単にtxt(拡張子などは.datなど、任意にすればよいと思いますが)でも構わないのでは?と思うのですがいかがでしょうか?
関数は定義しただけでは値を返しません。従って sub fnc1{ #### (2.cgi) return 'abcd'; } 1; これではfnc1は値を返しません。 2.cgiの中でfnc1を呼ぶ必要があります。 >*.plをCGIで使う場合には、 >*.plの最初にpackage *;と書くのは必須ですか? いいえ、全く関係ありません。 packageに関して説明するのは相当骨なので、参考サイトの紹介で勘弁してください。 私の言いたいことは、packageの仕組みを理解していないのならソースファイルの分割はすべきではなく、 packageの仕組みを学習してまでソースファイルの分割 をする必要があるかどうかよくお考えください、 ということです。
package宣言はご存知ですか? これをやらないと、複数のファイルに分けても変数の スコープが分離しませんので、保守性はかえって低下します。 それを踏まえた上でお読みください。 [1.cgi](呼び出し元) #!/usr/bin/perl print "Content-type: text/html\n\n"; print '<html><body>'; require '2.cgi'; require '3.cgi'; require '4.cgi'; $t1 = &fnc($t1,$t2); print $t1; print '</html>'; [2.cgi] $t1 = 'abcd'; 1; [3.cgi] $t2 = 'bc'; 1; [4.cgi] sub fnc{ $s1 = $_[0]; $s2 = $_[1]; return $s1.$s2; } 1; [出力] Content-type: text/html <html><body>abcdbc</html> 手元の環境で動作確認しました。各ファイル末尾の1;は #1の方がおっしゃるとおりです。
補足
ありがとうございます。 2.cgiでは変数は定義せず、値だけを返したいから sub fnc1{ #### (2.cgi) return 'abcd'; } 1; このようにしました。 やっぱり requireを消さないと処理が止まってしまいます。 package宣言はどのように使えばいいんですか? jcode.plというファイルを持っています。 最初にpackage jcode;と書いてあるんですが、*.plを CGIで使う場合には、*.plの最初にpackage *;と書くのは 必須ですか?
- feininger
- ベストアンサー率41% (74/180)
しまった。頭に return(1); を入れてしまった。 chuparkさんご指摘のようにsub.plは↓でもOKです。 [sub.pl] sub disp { print "[@_]"; return; } return(1);
補足
ありがとうございます。 下記の様に4つのファイルにしたんですが、require というのを書くと、その時点でCGIの処理が止まってしまう ようでした。 (1.cgi) は(1.pl)のようにしないと requireは書いては いけないんですか? 拡張子の .plと .cgiはどのように使い分けるものなんですか? #!/usr/bin/perl ####### (1.cgi) print "Content-type: text/html\n\n"; print '<html><body>'; require '2.pl'; require '3.pl'; require '4.pl'; $t1 = &fnc1; $t1 = &fnc2($t1,$t2); print $t1; print '</html>'; sub fnc1{ ####### (2.pl) return 'abcd'; } $t2 = 'EF'; ####### (3.pl) sub fnc2{ ####### (4.pl) local $s1 = @_[0]; local $s2 = @_[1]; return $s1.$s2; }
- chupark
- ベストアンサー率41% (90/218)
どうされたいのかがよく分からないのですが、 2.cgiや3.cgiはcgiにする必要があるのでしょうか? 4.cgiのようにサブルーチンを外部ファイルに…というのであれば、それぞれをライブラリとしておいて require を使うというのではどうでしょう? ライブラリを4.pl としておいたとして、 require '4.pl'; と呼び出せばよいだけだと思います。 ただし、ライブラリファイルの最後には、1;などとしておいて0以外の返り値が戻るようにしておかないとうまく動作しないんだそうです。
お礼
2.cgiの中でfnc1を呼んで解決しました。 ありがとうございました。