プロが教える店舗&オフィスのセキュリティ対策術

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ファイルのソースを教えてください。

A 回答 (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;
}
    • good
    • 0

.plはPerlの拡張子です。


.cgiはPerlだけとは限りません。
ってこれでは回答にはなってないでしょうか?^^;

あの、先にもどうされたいのかが分かりませんと書かせていただいたのは、質問の意味がわかりませんという意図ではなく、teeeyaさんも指摘されているように、どうしてこのソースを分割したいのでしょうかという意図をこめてのことで書かせていただきました。

そして、思うのですが、2.cgiなどはcgiでなくても、単にtxt(拡張子などは.datなど、任意にすればよいと思いますが)でも構わないのでは?と思うのですがいかがでしょうか?
    • good
    • 0

関数は定義しただけでは値を返しません。

従って
sub fnc1{ #### (2.cgi)
 return 'abcd';
}
1;
これではfnc1は値を返しません。
2.cgiの中でfnc1を呼ぶ必要があります。

>*.plをCGIで使う場合には、
>*.plの最初にpackage *;と書くのは必須ですか?

いいえ、全く関係ありません。
packageに関して説明するのは相当骨なので、参考サイトの紹介で勘弁してください。
私の言いたいことは、packageの仕組みを理解していないのならソースファイルの分割はすべきではなく、
packageの仕組みを学習してまでソースファイルの分割
をする必要があるかどうかよくお考えください、
ということです。

参考URL:http://www.rfs.jp/sitebuilder/perl/04/01.html
    • good
    • 0
この回答へのお礼

2.cgiの中でfnc1を呼んで解決しました。
ありがとうございました。

お礼日時:2003/09/14 23:55

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 *;と書くのは
必須ですか?

補足日時:2003/09/14 20:43
    • good
    • 0

しまった。

頭に 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;
}

補足日時:2003/09/14 18:32
    • good
    • 0

どうされたいのかがよく分からないのですが、


2.cgiや3.cgiはcgiにする必要があるのでしょうか?

4.cgiのようにサブルーチンを外部ファイルに…というのであれば、それぞれをライブラリとしておいて
require を使うというのではどうでしょう?

ライブラリを4.pl としておいたとして、

require '4.pl';

と呼び出せばよいだけだと思います。

ただし、ライブラリファイルの最後には、1;などとしておいて0以外の返り値が戻るようにしておかないとうまく動作しないんだそうです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!