ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qperlでファイルを分割するプログラム

3Mを超える1つのテキストファイルに入っているデータある目印をもとに分割したいと思っています。分割ソフトをさがしたのですが見つけられませんでした(サイズで分割はありました)perlでテキスト処理ができると思い「テキスト処理とCGIのためのPerlプログラミング 伊藤 博康 (著) 」という本を借りてきたのですが、そのようなサンプルがなく1からperlを勉強する時間もないため、ここで質問させていただきました。ネット上にファイルを分割するperlのサンプルプログラムがありましたら教えてください。よろしくお願いします。

Aベストアンサー

 存在しません(^_^;
 簡単に「ある目印」と書かれていますが、その目印はプログラマーの数だけ種類があり、その目印の形によってはプログラム構造自体の変更が必要です。
 読者が欲しい目印の形を先読みしてプログラムを組むのは不可能です。

 どんな目印でしょうか?
 簡単な目印なら、ここにサンプルプログラムを書けるかもしれません。

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qハッシュのキーを変数で

ハッシュ$FORM{'key'}のkeyの部分を変数でしたいのですが
どのように記述すればよいのでしょうか。
初歩的なことかもしれませんが、ご存知の方
ご教授お願いします。

感じとしては、下記のようなことをしたいです。ちゃんと動きませんが。
for($i=1;$i<=10;$i++){
$dummy="data$i";
print "$dummy:$FORM{$dummy}<br>";
}

Aベストアンサー

 そのプログラムは特に問題ありません。
 連想配列変数 %FORM に値が正しく入っているかどうか確認してください。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

QPerlの変数に文字数制限(容量制限)はあるか

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、べろっと出すだけの処理です。
掲示板書き込みなので unshift で上が新しい書き込みにしてあります。
通常のタグ禁止処理や、改行コード処理はしてあります。Perl5.6.1です。

数日前、容量が減っていることに気付き、調べてみると、

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き

のような形でデータが欠けていました。欠けていると言っても9割方消えていました。
残っていたのは新しい側の書き込みです。
いつ消えたのか、何をした時に消えたのかが不明のため、原因を探っている段階です。

もちろん、一番怪しいのはプログラムのミスなのですが、それも調べつつ、
ちょっと前から気になっていた点として、データ容量が1.5MBぐらいまで
ふくらんでいて重くなっていたんです。
data.dat のような1ファイルにテキストばかり1.5MB、そして内部の処理でも
普通にその容量を一つの変数に入れたりしています。
データが唐突にぶつっと切れていることと、容量が多くて気になっていたこと、
この辺りでちょっと怪しいのですが、変数の容量制限、ファイルの容量制限が
調べても出てきません。知っている方いましたら教えてください。

他にも、そういうバグの時こういうミスがあったよ、など、ありましたら
アドバイスをお願いします。
自分が作った物のデバッグで恐縮なのですが、よろしくお願いします。

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、...続きを読む

Aベストアンサー

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと思います。もちろん、読み込み内容が壊れるには違いないですので、読み込みルーチンにもflock()は追加すべきです。

データファイルが壊れるケースですが、既存記事の修正機能が実装されている場合などで、読み込みルーチンで取得した@BbsDataの値を使った書き込みルーチンが別にあった場合には、たとえその書き込みでファイルロックがされていたとしてもデータファイルが壊れることになります。

もっともその場合、データ変更に関する一連のロジック自体を見直す必要があるかもしれません。
既存記事の変更を行う場合には、「一度のファイルオープン+ファイルロックの間に、読み書きを全て済ませる」という処理に置き換えないと、ほぼ同時に複数の書き込みが発生した場合に一部のデータが失われるという別の不具合が発生する恐れがあります。ご参考まで。

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと...続きを読む

QPerlで use strict して our変数

Perl 初心者です。初めて質問します。

test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。

環境 : WindowsXP / ActivePerl 5.14.2


--------------------
* test_sub.pl
--------------------
#!/usr/bin/perl
use strict;

our $hoge = 'HOGE';

1;
--------------------
* test_main.pl
--------------------
#!/usr/bin/perl
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
--------------------

これを実行すると、
Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r
というエラーが出ます。

require する前に、test_main.pl のほうで our($hoge); と宣言したり
参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、
これらをしないとできないものなのでしょうか。

use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい…

継承のようなことをしたいのです。

ちなみに以下試してみたソースです。

--------------------
* test_main.pl
--------------------
#!/usr/bin/perl

########################################
# NG
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;

########################################
# OK our変数を宣言しておくといける
=pod
use strict;

our ($hoge);
require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
=cut

########################################
# OK 参照する際にパッケージ名を指定すればいける
=pod
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $main::hoge;
=cut

########################################

########################################
# NG
=pod
use strict;

use base qw(test_sub);

print "Content-type: text/html\n\n";
print $hoge;
=cut

########################################
--------------------
* test_sub.pm
--------------------
#!/usr/bin/perl
package test_sub;
use strict;

our $hoge = 'HOGE';

1;
--------------------

NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。

もしご存じの方がいらっしゃいましたら教えてください。
よろしくお願いします。

Perl 初心者です。初めて質問します。

test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。

環境 : WindowsXP / ActivePerl 5.14.2


--------------------
* test_sub.pl
--------------------
#!/usr/bin/perl
use strict;

our $hoge = 'HOGE';

1;
--------------------
* test_main.pl
--------------------
#!/usr/bin/perl
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
--------------------

これを実行すると、
Global symbol "$...続きを読む

Aベストアンサー

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるファイルの取り込みは実行時に行われます. つまり
require 'test_sub.pl';
とあってもコンパイラは test_sub.pl の中は見ません. したがって「test_sub.pl の中の our」はコンパイル時には影響を与えません.
・また, our の有効範囲はレキシカルスコープに制限されています. そして「1つのソースファイル」はレキシカルスコープとなりますから, require をコンパイル時に行っても「test_sub.pl の中の our」は test_sub.pl の中 (もちろん our 以降の) でしか有効ではありません.

余談ですが, use strict もレキシカルスコープで有効となります. つまり, 「test_sub.pl の中の use strict」はそれを require した test_main.pl では無効です (し, 逆に require する前に test_main.pl で use strict してもそれは test_sub.pl には影響しません)

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるフ...続きを読む


人気Q&Aランキング