- ベストアンサー
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ファイルのソースを教えてください。
- ninmurai
- お礼率38% (24/63)
- Perl
- 回答数6
- ありがとう数2
- みんなの回答 (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以外の返り値が戻るようにしておかないとうまく動作しないんだそうです。
関連するQ&A
- Perl からbashを呼び出したい
Perlからbashのファイルを呼び出そうとしています。 sendmail2.cgiは、呼び出せていまが、 sendmail3.cgiは、呼び出せません。 bashのファイル自体は、./(bashファイル)とやると実行できます。 パーミッションは、 sendmail3.cgi 655 mail_plain.sh 755 sendmail2.cgi 705 mailsend.sh 705 です。 パスの設定の問題かとも思ったのですが、よくわかりません。 宜しくお願いします。 ===sendmail2.cgi============= #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>sendmail test</P>\n"; print "mailtest\n"; print "</HTML>\n"; exec('/home/httpd/wwwroot/yoshida/mailsend.sh'); exit(0); ============================== ===sendmail3.cgi============= #!/usr/bin/perl exec("/home/httpd/wwwroot/bbstest/mail_plain.bash"); exit(0); ==============================
- ベストアンサー
- Perl
- perlがうごきません
htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。
- ベストアンサー
- Perl
- Perlがサーバー上でうごきません
htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。
- ベストアンサー
- Perl
- perlのcgiが動かない・・・
cgiを組もうと思い、まずは簡単なもので試そうと思ったのですが、 うまくいかず困っています。 ↓プログラムは、こんな感じです。 ファイル名:index.cgi #!/usr/bin/perl print "<html>"; print "<body>"; print "abc"; print "</body>"; print "</html>"; <やってみたこと> ・Perlのパス「#!/usr/bin/perl」 が間違っていないか? which perl で /usr/bin/perl とでます。 ・Apache の設定が正しく行なわれているか? http://localhost でindex.htmlがきちんと表示できています。 ・「hello.cgi」 の設置場所を間違っていないか? プログラムソースが出るということは、 間違っていないのではないでしょうか? ・ためしに実行してみた TELNETで ./index.cgi <html><body>abc</body></html> とでてきました。 これはちゃんと動いているのでは?? 何か勘違いしていますか? お気づきの点を教えてください。よろしくお願いいたします。
- ベストアンサー
- Perl
- cgi(perl)でパラメータが渡せない
以下のプログラムでnum=9が伝わらないので、ミスをご指摘ください。 グラフィカルなアクセスカウンタを表示させようとしていますが うまくいかないのでテキストモードでデバッグしています。 [ /usr/local/apache2/htdocs/gif-view.html ] <html> <head> <meta http-equiv="Content-type:" content="text/html; charset=UTF-8"> <title>gif-view</title> </head> <body> <iframe src="/cgi-bin/gif-test.cgi?num=9"></iframe> <!-- <img src="/cgi-bin/gif-test.cgi?0" width=50 height=50> --> </body> </html> [ /usr/local/apache2/cgi-bin/gif-view.cgi ] permission は 755 にしています。 #!/usr/bin/perl print "Content-Type: text/plain;\n\n"; print "gif-test.cgi\n"; $prm0 = @ARGV[0]; if($prm0 = "") { print "Param is exist\n"; } else { print "Param is empty\n"; 実行結果として gif-test.cgi Param is empty となります。 httpd.conf で Script Alias /cgi-bin/ "/usr/local/apache2/cgi-bin/" を有効にしています。
- ベストアンサー
- Perl
- Perlで 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
- CGIが文字化けしてしまう。(Perl)
環境 WinXP Apache ActivePerl 開くソフトは「Tera pad」 でやっています。ソースは #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>CGI TEST</TITLE></HEAD>\n"; print "<BODY>ああああ。</BODY>\n"; print "</HTML>\n"; __END__ です。「ああああ」部分が「‚ ‚ ‚ ‚ B」 と表示されます。 どなたか解決方法ご存知の方いらっしゃいましたら ご回答お願いします。
- ベストアンサー
- CGI
- Perl/CGIについて
#!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $jcode = './jcode.pl'; $to = 'ha***@***.ne.jp'; #$from = ''; $subject ='名鉄と地下鉄の直通運転'; # 文字コードライブラリの読み込み require $jcode; # メール送信 &jcode'convert(*subject,'jis'); open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae\n"; print " $naiyou\n"; print "メールを送信しました\n"; end #確認表示の所で表示が改行されない。
- ベストアンサー
- Perl
- perl の printでのファイルへの指示で
独学でmacでパールを勉強しています。 始めてからまだ1週間くらい。 教科書みながら、print命令でファイルハンドルに指示を出してるのですが、 書き込めはできるのですが、 ファイルが無い場合、 新規に自動でファイルが作成されるはずとの記載があったのですが、 何故か、自動でファイルが生成されません。 調べても、設定が必要等言われてますが、 mac自体も初心者でほとんどわかりません。 どのような設定にすればいいのでしょうか? また、ソースに何か悪い所があるのでしょうか? お助けください。 下記は実験用に作ったソースですが、 作動もしてるのですが、 新規に自動でファイルが作成されるはず が 何故か作成されません。 ちなみに localhost上で動かしてます。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>test</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; open ( FH ,">tukuruzo.txt"); print FH "tukuruzo"; close ( FH ); print "</BODY>\n"; print "</HTML>\n"; __END__
- ベストアンサー
- Perl
- CGIファイルの送り方教えて下さい
はじめまして!超初心者です。 最近CGIを本を見ながら勉強しているんですが ファイルの送信の仕方が分かりません。やはり HTMLファイルとは送信の仕方が違うのでしょ うね?誰か教えて下さい。 (FTPソフトはFetchです。) ちなみに送りたいファイルは --------------------------------- #!/usr/local/bin/perl print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<H1>Hello!</H1>\n"; print "</HTML>\n"; --------------------------------- です。
- ベストアンサー
- CGI
お礼
2.cgiの中でfnc1を呼んで解決しました。 ありがとうございました。