• ベストアンサー
  • 困ってます

cgiとplとpm

掲示板ソースをダウンロードするとplやpmという拡張子のものがありました。中身はPerlでした。 拡張子の使い分けを教えてください。 適当に4つのルールを書いてみましたので、間違っていたり、追加するルールがありましたから教えてください。 1 ブラウザがそれ自身にアクセスし、ブラウザのアドレスバーに表示させるならcgiにするべき。 2 Perlのpackageの機能を使うなら、パッケージファイルはplかpmでなくてはならない。 3 Perlのrequireの機能を使うなら、その外部ファイルはplでなくてはいけない。 4 Perlのuseの機能を使うなら、その外部ファイルはpmでなくてはならない。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数5208
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

基本的に拡張子は、あっても無くてもなんでもOKです。ただ、モジュールには.pmをつけなければなりません。 また、webサーバによってCGIとして使える拡張子に制限がある場合があります。 1.について 言語として、特に拡張子を.cgiにしなければならないというのはありません。.plでも.doでも.hoge でも基本的には大丈夫ですが、大抵運用するwebサーバによって使える拡張子が制限されています。.cgiしかダメなサーバとか。 2.について そのような制限はありません。拡張子は何でもOKです。 ただ、前述の通りwebサーバによって拡張子の制限がかかっている場合はCGIとしては実行できません。 3.について そのような制限はありません。拡張子は何でもOKです。 4.について その通りです。use関数の対象になる外部ファイルは.pmでなければなりません。

共感・感謝の気持ちを伝えよう!

質問者からの補足

サーバの方は自分で設定しているので、もしかしたら.cgi以外を.cgiのようにさせることができるかもしれないということは分かるんですが、人が作ったPerlには.plや.pmがあるので、なぜ.cgiにしなかったのか知りたいです。 .pmはuseの対象にするなら必須条件だということをここで教わりましたが、.plはどういう場合に使われるものなんですか? 予想としてはHTMLソースを出力しないものを.plにしているように見えました。

その他の回答 (2)

  • 回答No.3

もともと便宜上Perlのスクリプトファイルは拡張子に".pl"がつけられてきました。 Webサーバからプログラムを実行する仕組みとしてCGIが誕生したとき、CGIとして動くプログラムファイルには".cgi"という拡張子をつけるというお約束ができたみたいです。 これは、Webサーバが何でもかんでもプログラムを実行させないように出来た決まりですね。 これは単なる慣例であり、必ず従わなければいけない決まりではありません。 CGIは、どんなプログラムファイル(C言語で作られたものでもシェルスクリプトでもawkでもsedでも)でもCGIとしての仕様を守ればCGIとして動作します。なので、拡張子が.cgiだからといってPerlで書かれたファイルとは限りません。 そのあたりの区別をしたい方は拡張子を.plとしたりするでしょう(私も.cgiは使わず、.plを使います)。 HTMLソースを出力しないものを.plにしている、というのも、ソースを書いた作者次第?だと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 cgiファイルの管理で中身の言語をファイル名で判断できるするためにも.plが有効ということですね。

  • 回答No.1
  • osamuy
  • ベストアンサー率42% (1231/2878)

4はあってますが、1から3までは必須ではないです。 1) サーバの設定次第ですので、cgiにしたからといって正しく動くとは限りません。 2) package機能は名前空間の制御に利用するものなので、別ファイルにするかは関係ないです。 3) requireは任意のファイル名を指定できます。ただしファイル名でなく、引用符で囲ってない単語(bare word)を指定した場合、挙動が変わります。 詳しくは、ドキュメントperlfuncのrequireとuseのところ、ドキュメントperlmodをご覧ください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。

関連するQ&A

  • xyzzyで拡張子がcgiやpl, pmのファイルを開くとタブが効きません。

    xyzzyで拡張子がcgiやpl, pmのファイルを編集しているのですが、そのファイルを開くとタブが効きません。 新規で開いたファイルはタブが効きますが、xyzzyでどのように設定すればよいのでしょうか?

  • cronからCGI呼び出し

    movabletypeで指定日に投稿する機能がありまして、仕組みは cronを使って「run-periodic-tasks」を動かすというものです。 ですが、私が利用しているサーバでは直接cronをいじる事が出来ず 変わりにコンパパネからcronを設定出来る仕様になっています。 そこで指定できるファイルの拡張子が「*.cgi」「*.pl」「*.rb」のみです。 動かしたいファイルは「run-periodic-tasks」で拡張子がありませんので 当然指定が出来ません。 そこで私が考えたのが、別にcgiファイルを作成、そのcgiファイルから 「run-periodic-tasks」を動かすという方法です。 ですが、うまく動作しません。 ■作成したファイルは以下の通りです。 【run.cgi】 --------------- #!/usr/bin/perl -w require './run-periodic-tasks'; exit; --------------- ■run-periodic-tasks --------------- #!/usr/bin/perl -w use strict; 【省略】 1; --------------- どなたかお分かりになる方ご回答の程宜しくお願いします。

    • 締切済み
    • CGI
  • plファイルの中で他のplファイルを実行

    A.plファイルとそれに付随するpmファイルがあります。 別のB.plでA.plに値を渡しながらループさせてA.plを実行し得られた値をB.plに返すことがしたいのですが、 B.plで ループ始点 require('A.pl'); ループ終点 だと一回きりの実行結果しか得られず。 #`perl A.pl @AAA`; だとreturnできずエラー となってしまいます。 何か良い方法は無いでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • 'cgi-lib.pl'などのファイルの位置は?

    Perlの基本的な質問ですが、cgi-lib.plやjcode.plは どのディレクトリに入れれば自然でしょうか? 私はLinuxとWindowsの両方にPerl5.6を入れておりまして、今までは相対パスによって、スクリプトの近くに置いていましたが、ディレクトリ(フォルダ)が変わるごとに設定しなおしで面倒になってきました。 WEBでもレンタルサーバーなど利用したことは無いんですが、このような基本ライブラリは、require 'cgi-lib.pl';で呼び出して?いると思いますが、 しかるべき位置にこのファイルが無いとだめだと思います。ご教授ください。

    • ベストアンサー
    • Perl
  • CGI..pmをテストしようとするとエラーがでます。

    こんにちわ。windowsXPを使用していますが、CGI.pmをテストしようとするとエラーが出てきます。内容は「perl.exe.アプリケーションエラー 0x28085b5dの命令が0x00000004のメモリーを参照しました。メモリが\"written\"になることは出来ません。」というものです。どうすれば解決するのでしょうか。教えて下さい。勉強不足で全く解りませんが、自分で原因をわかる範囲で考えるとCGI.pmをplの中で複数回use CGIという最初の箇所から入れたからなのか…でも全く解りません。サブルーチンの中で一回一回use~書かなくても良いのでしょうか?それも解らないので教えて下さい。最初は一回一回subの中で書かずファイル冒頭に書いただけだったのですが、テストするとプロンプトでsubの中で呼ばれているsubを「不明なsubである」と出たので、ブロック中で最初から書いてみました、するとそれが出なくなりました。でもブロックの中で同ページでもuse CGI;$q=new CGIと書かなくてはいけないのだろうかと半信半疑です。CGI.pmは今回初めてテストしてみました。理解していない部分が多いですが、エラーとuseの件よろしくお教え下さい。

  • jcode.pl と &ReadParse()

    CGIファイルの先頭は #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; &ReadParse(); という感じになっています。 ここでのの require は、日本語を使うためのもの だと思っています。合っていますか? &ReadParse() というのは何ですか? require と関係があるみたいです。 require を書かずに &ReadParse() を書くとCGIエラーになります。

    • ベストアンサー
    • CGI
  • .pl ファイルのアイコン

    素朴な疑問です。 windows で .pl の拡張子を持つファイルのアイコンは何やら汚い黄色い丸みたいなものですよね。 あれって何なんでしょうか?

    • ベストアンサー
    • 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
  • 「jcode.pl」というファイルはどこにUPすべきでしょう?

    「jcode.pl」というファイルはどこにUPすべきでしょう? ただいまサーバー移転をしているのですが(サーバー移転は初めてです) 移転後、ひとつひとつファイルを確認していると「jcode.pl」というファイルを発見しました。 拡張子から、Perlで記述されたプログラムかな?と判断いたしました。 もしそうならば、サーバーで指定されているPerlのパスにしたがって移動させるべきでしょうか? ちなみにこのファイルは、サーバーの(いじれる部分の)第2階層にはいっています。 Perlのパスは /usr/local/bin/perl です。 しかし、上記のパスの位置に、私が入って行くことは出来ません。 動かす必要はあるのでしょうか? 当方初心者です。まとはずれな質問をしているかもしれませんが どうぞよろしくお願い致します。