- ベストアンサー
perlで他のディレクトリにあるcgiファイルの関数を呼び出す方法
- 初心者向けのperl入門:他のディレクトリにあるcgiファイルの関数を呼び出す方法を解説します。
- perlのプログラミングで他のディレクトリにあるcgiファイルの関数を呼び出す方法を詳しく解説します。
- perlの基本的な構文を使って他のディレクトリにあるcgiファイルの関数を呼び出す方法をわかりやすく解説します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Exporterってのは使ったことないですがPMなら便利なのでよく作ります。 簡単で短いサブルーチンが数個程度なら確かに文字が多くなって(冗長性が高い)面倒なだけなのですが、制作物自体が大きく量が多いなら以下のようなメリットがあります。 モジュール化の利点 1.自作サブルーチンを機能別に整理分類してパッケージ化すれば、後に再利用が容易になり、不具合も容易に発見できる。 2.MovableTypeのようにCPANのモジュールをサーバ側にインストールされていなくても条件付(PurePerl)なら流用できる。 他にもあるのでしょうけど、実務上過去に作ったプログラムを使いまわしたり少しの改造で新しいモジュールが出来たりで実際重宝してます。 サブルーチンで「require」だとあとになってあれどこだっけって実際なるんです。見つからなかったり忘れてたりだと一から書き直し。 整理分類して一箇所でまとめておけば強力な補助になってくれます。特にDB関係をいじる場合。 簡単な例:実際の足し算をコメントアウトしてつけたしております。 /aaa/a1.cgi #↓=========================== : use lib '/libs'; use MyPM::b1; : my $obj = new b1; : ## $obj->{DATA1} = 1; ## $obj->{DATA2} = 2; : ## print $obj->hoge; $obj->hoge; : #↑=========================== /libs/MyPM/b1.pm #↓=========================== package b1; sub new { my $class = shift; ## オブジェクト作成 my $self={ ## DATA1 => undef, ## DATA2 => undef, : }; return bless $self,$class; } sub hoge { my $self = shift; ## my $DT1 = $self->{DATA1}; ## my $DT2 = $self->{DATA2}; ## my $DT_RETURN = $DT1 + $DT2; : ## return $DT_RETURN; return; } : 1; #↑=========================== とりあえず蛇足ということで、役に立たなかったらすいません。
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
最後の「1;」は, ある意味「おまじない」のようなものです. Perl の場合, require/use などでスクリプトを読み込んだときに当該スクリプトは「読み込みが成功したかどうか」を返すことになっています. その値は「スクリプト中で最後に評価した値」であり, これが「偽」のときには「スクリプトの読み込みに失敗した」ということで実行を中断してしまいます. ただ, 多くのスクリプトではこんなことはしない (特に純粋に Perl だけで書かれたものなら「読み込みに失敗する」ことはまずない) ので, 「確実に『真』の値を返す」ようにスクリプトを作る必要があります. だから 1; でなければならないということはなく 4; でも 'a'; でもなんでもいいんですが, 慣例として「1;」としています.
お礼
そう言うことですか。 大変ご丁寧なご説明、誠にありがとうございます。 まだまだ、自分の勉強不足を痛感いたしました。 ありがとうございました。
- auto-mata
- ベストアンサー率12% (1/8)
私は、pm モジュールを作り、その中の関数を呼んでいます。 ttp://www.rfs.jp/sb/perl/04/01.html 特に、「Exporter」機能で、@EXPORT ~ を使用すると、呼出し側の記述は、 内部関数のように呼べるので楽です。
お礼
ご回答ありがとうございます。 ご指示いただいたサイトを参考にうまくいきました。 ありがとうございました。 なお、私の理解不足なのですが、 ralf124c様の方法との違いが、分かっていません。 ralf124c様の方法は、パッケージモジュールではないのでしょうが、 そちらの方が、package文が無い分、シンプルなような気がするのですが。 名前空間が有るか無いかの差なのでしょうか。 >内部関数のように呼べるので楽です。 がまだわかっていません。もう少し調べて勉強してみます。 ありがとうございました。
- ralf124c
- ベストアンサー率52% (232/446)
あ、ごめんなさい。 requre "/bbb/b1.cgi"; じゃなくて require '/bbb/b1.cgi'; でした。
- ralf124c
- ベストアンサー率52% (232/446)
/aaa/a1.cgi #↓=========================== : requre "/bbb/b1.cgi"; : &hoge; : #↑=========================== /bbb/b1.cgi #↓=========================== : sub hoge{ : } : 1; #↑=========================== こんな感じです。 最後の1;をお忘れなく。
補足
ご回答ありがとうございます。 >最後の1;をお忘れなく。 最後の1を入れなくても、正常に動いてるようなのですが、 私の勘違いでしょうか。
perlは使用したことがありませんが。 perl requireで検索すればわかります。 ttp://www.nishishi.com/perltips/script1.html 他の言語でいうところのincludeです。
お礼
ご回答ありがとうございます。 ご提示いただいたサイトを参考にして、 うまくいきました。 ありがとうございました。
お礼
>後に再利用が容易になり、不具合も容易に発見できる。 >整理分類して一箇所でまとめておけば強力な補助になってくれます。 わかりました。そういうことなんですね。 大変べんきょうになりました。 >役に立たなかったらすいません。 私がまだperlを詳しく理解できていないだけです。 /libsなどのフォルダに、ライブラリのような感じで、 よく使うサブルーチンなどを固めておくことですね。 (まだ、解ってない?) いずれにせよ、このたびの質問に対して、皆様から大変ご丁寧なご回答いただき、 深く感謝もうしあげます。もっと勉強します。 ありがとうございまいた。