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と関連する良く見られている質問

Q.zipファイルのパスワード解除方法

画像のデータ、音楽のデータを保存するために.zipファイルにパスワードを掛けたのですが、忘れてしまって解除することができません。
パスワードを解除する方法はありますか?

Aベストアンサー

普通は解除できませんが、このソフトを使えば簡単に解除できますよ。
Advanced ZIP Password Recovery
このサイトより試用品をダウンロードしてください。
インストーラー英語ですがソフトのオプションタブのLanguageタブで
Japaneseを選ぶと日本語になります。2kでは文字化けします。
このソフトは有料ですがどこかにserialがあるかもしれません。

参考URL:http://www.elcomsoft.jp/?page=archives#zip

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qzipファイルパスワード解除

zipファイルパスワード解除
zipファイルにパスワードをかけたのですが、パスワードを忘れてしまいました。
PikaZipというソフトで検索してみたのですが、何時間たっても結果が出ませんでした。
何かいい方法はありますか?

Aベストアンサー

ありません。
短時間でとけるようなものならパスワードの意味が無いですから。

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

QEXCELファイルのパスワードの解除

EXCELファイルをパスワードで他の人の閲覧から守ることを
ここで教えていただきました。

「名前をつけて保存する」ときに「全般オプション」で
設定するとのことでした。

今度はその解除の仕方を教えてください。

つまり1度オプションでパスワードをつけた機能を解除する仕方です。

もう一度「名前をつけて保存」して、その際は何もパスワードを
設定しなくて保存してもダメでした。

教えてgoo!!

Aベストアンサー

ツール→全般オプション。ここでパスワードを設定しましたよね。

元に戻す(パスワードを解除)時は、ファイル→名前をつけて保存。
ツール→全般オプションで、パスワードを消します。
次、開く時はパスワードの要求はしてきません。

これでやってみていかがでしょうか?

Q@color1 = ('0000ae',・・・,'$user_color')で・・

とまとです。

行き詰まりました(TェT)

標題の代入で、'$user_color'の部分を文字列ではなく、後から出て来るinputで入力した文字を代入させるにはどうしたらいいのでしょう?
※標題のままだと「$user_color」という"文字列"が代入されてしまいます。

Aベストアンサー

変数の内容を展開したければ、
' でくくらなければいいわけですが、
後から出てくるなら、その代入時点では
undefine 状態ですか?

Q圧縮ファイルを解凍せずパスワードだけ解除するソフト。

圧縮ファイルを解凍せずにパスワードだけ
解除するソフトってありませんか?

もちろんパスワード自体はわかっています。

Aベストアンサー

ちょっと作業中なので、後でやってみるとして・・・。
もしこれが出来るのなら、パスワードのくっついている部分を削除して、通常の部分に置き換えれば、パスワードがなくても、解凍出来るアングラツールが出来ることになります。
そう言ったツールがあるのなら、誰でも考えそうだし、すでに作られているかと。
・・・、とはいえ、暗号化されている・・・のかな?^^;
どうなっているのでしょうか?zipのパスワードって。
後で、バイナリーで違いをチェックしてみようかと思います。

単純に、前もって、パスワードを入力して、一度解凍して、再圧縮するツールは、技術的には、十分可能です。
まぁ、需要がなさそうなので、あるかどうかはわかりませんが。

Q@×× = $q->param('**'); の書き出しについて

このようなチェックボックスを作って
<INPUT type="checkbox" name="q1" value="A">A<br>
<INPUT type="checkbox" name="q1" value="B">B<br>
<INPUT type="checkbox" name="q1" value="C">C<br>

このようなPerlの記述をして
use CGI;
$q = new CGI;
@q1 = $q->param('q1');

このようなCGIの値の書き出し部分はどうしたらいいですか?
print "<td width=300><font size=2>●●{'q2'}</font></td>\n";

上記の
@q1 = $q->param('q1');
に、チェックされた値が格納されているんですよね。
その値を表示させたいと思っています。
いろいろ教えてもらって、ここまでたどり着きました。

Aベストアンサー

#3さんの『お礼』にあるコードですが、間違っているところだけ書いておきます。

原因はCGI.pmと独自の入力処理が、それぞれデータをとり合っていることです。このコード上では、独自の入力処理の部分がSTDINを読み込んでしまうので、CGI.pmからは何も読む事は出来ません。

入力処理には、CGI.pmか独自入力処理の『いずれか』を用いてください。全て書いても使えるのは一つだけです。質問内容から考えられるお勧めは、CGI.pmを利用する事です。(オーバースペックですが、ひとまずそう言うことは考えない方針で。)

コードを見る限り、恐らく『データでコード処理』の部分を全て削除すれば大丈夫だと思います。

Qファイルをロック(パスワードで解除。)する方法を教えて頂いてもよろしいでしょうか?

いつもお世話になっております。
今回質問させて頂きますのは、エクセルで作成した名簿のファイルがありまして、PCを起動した時に、ロックで、パスワードを入力しなければPCを使用出来ない方法は知っておりますが、今回、同様にファイルでパスワードを入力しないと開けない様にしたいのですが、もしその方法がありましたら教えて頂いても宜しいでしょうか?

Aベストアンサー

保存の際、「名前を付けて保存」を選択すると保存先等の画面が表示されるかと思います。
その際、右上にある「ツール」から「全般オプション」→「読み取りパスワード設定」にパスワード入力でいいかと思います。
バージョン等で設定が困難な場合は申し訳ございません。
参考までに下記のURLをどうぞ。

参考URL:http://www.global.co.jp/iep/iep62/iep621201.html

Q@b = grep(/マッチパターン/, @a);でなく@a = grep(/マッチパターン/, @a);でOKについて

@b = grep(/マッチパターン/,@a);だと配列@aの中でマッチするものを探して@bに入れる・・・というのは理解できるんですが、
@a = grep(/マッチパターン/,@a);とし、
foreach $_ (@a) {
print $_;
}
で参照した場合、@aの中のマッチパターンにマッチするのだけ表示されますけれども、ここでマッチしないのは削除されるのでしょうか・・。

@aから@aにいれる・・・となる事について、どのように@aにマッチしたものを入れ、マッチしないものは削除されるのかの仕組みについて、ご説明できる方はいらっしゃいますでしょうか(例えば内部的にpopやshiftが機能していて・・・みたいな事なのかな・・とか思うんですけれども)

お手数ですが、ご存知の先生方ご教授願えましたら幸いです。

Aベストアンサー

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
{
dVAR;
OP *o;

(略

if (is_list_assignment(left)) {
static const char no_list_state[] = "Initialization of state variables"


という具合なので、代入の左右両辺が同じ変数かどうかのチェックは多分やってません。

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP...続きを読む


人気Q&Aランキング