- ベストアンサー
Perlのパッケージとモジュールの概念について
- Perlのパッケージとモジュールの概念について、初心者向けに解説します。
- Perlで標準モジュールを使う方法や、モジュール内の変数にアクセスする方法について説明します。
- Perlのパッケージとモジュールに関する疑問を解消し、スクリプトの理解を深めましょう。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず名前空間というものを理解してみてください。 http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93 http://d.hatena.ne.jp/keyword/%CC%BE%C1%B0%B6%F5%B4%D6 名前空間が理解できれば、パッケージも理解できると思います。 http://flex.ee.uec.ac.jp/texi/perl/perl_194.html >とありまして、グローバル変数がないのなら、「パッケージ変数」 >ということなのかなあ?と考えたりしました。 そう考えて良いのではないかと思います。 ちなみに、パッケージ名の指定がない場合は、mainパッケージの変数とみなされます。 たとえば以下を実行してみれば…どうでしょうか? $test="main"; {package packageA; $test="packageA"; } {package packageB; $test="packageB"; } print $test,"\n"; print $main::test,"\n"; print $packageA::test,"\n"; print $packageB::test,"\n"; >初めにパッケージありき? >それからモジュール? 初めにパッケージありきで、それからモジュールと考えて良いと思います。 パッケージというのは、あくまでも、名前空間であるので、ひとつのファイルに複数のパッケージが存在していて構いません。上記の例のような感じで。 また、複数のファイルで、ひとつのパッケージを共有させても問題なく動作します。 では、モジュールとはなんなのか? 昔つかった入門書( http://www.amazon.co.jp/gp/product/4781907954 )によると、 >便利なサブルーチンをパッケージにとじこめて汎用的に使えるようにしたものをPerlでは特にモジュールと呼びます。 とあります。 また、モジュールとして利用(use で指定できる)条件は、モジュールのファイル名は、パッケージ名.pmであることが必要です。 http://www.rfs.jp/sb/perl/04/01.html まとめると… パッケージは名前の衝突をさけるために存在するもの モジュールは再利用可能にしたサブルーチンのあつまり と考えればよろしいのではないかと思います。
その他の回答 (3)
- qtea
- ベストアンサー率77% (38/49)
No2の補足。 use CGI; の前に、$CGI::POST_MAXの値を設定しているのは、$CGI::POST_MAXが設定値だから、だと思います。 設定値は上のほうにあったほうが(というかまとめてあるほうが)、設定値を変更するときに、ちょっと楽ですよね? だから、一行目に書いてあるのだと思います。
- qtea
- ベストアンサー率77% (38/49)
use CGI; は… BEGIN{ require("CGI.pm"); } と、ほぼ同じなので、use CGIの前に$CGI::POST_MAXに値を設定してもエラーにはなりません。 パッケージというのは、変数名や関数名の衝突を防ぐ為にあると考えるのがよいのではないかと思います。 モジュールは…うーん…パッケージをもっと便利にしたもの…かな… >use CGI;と記述するときと >$CGI::と記述するとき、何が異なるのでしょうか? >後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? use CGI;は、CGIモジュールを使います、という意味になります。 $CGI::は、CGIという名前の、例えば、POST_MAX変数を使うという意味になります。 use CGI;なしで、$CGI::を使った場合、CGI.pmは使うことにはなっていませんので、CGI.pmの$POST_MAX変数を使うことはなりません。 なので、CGI.pmの$POST_MAX変数を使うのであれば、use CGIが必要になります。 もうちょっと詳しく書いてみると… use CGIなしで、例えば、 $CGI::POST_MAX=100; とした場合は、単に、CGIという名前のパッケージの$POST_MAXに値を入れているだけ、になります。 use CGIありで、 $CGI::POST_MAX=100; use CGI; とした場合は、なしの場合とほとんど同じではあるのですが、CGIモジュール内で、$POST_MAXを設定値として使用してるので、CGIモジュールの設定値を変更したという意味にもなります。 うーん、ちょっとくどいですね。 このあたりは、自分で、簡単なモジュールを作ってみると理解しやすいのではないかと思います。 http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod http://torus.jp/memo/x200311/PerlModule.rd.html
お礼
qteaさん、コメントありがとうございました。 私の質問文が分かりにくくて申し訳ありませんでした。 頂いたコメントの中では >>use CGI;は、CGIモジュールを使います、という意味になります。 >>$CGI::は、CGIという名前の、例えば、POST_MAX変数を使うという >>意味になります。 >>use CGI;なしで、$CGI::を使った場合、CGI.pmは使うことには >>なっていませんので、CGI.pmの$POST_MAX変数を使うことはなりません。 >>なので、CGI.pmの$POST_MAX変数を使うのであれば、use CGIが必要になります。 ここを読んで、以前より分かったように思います。 use CGI; →→モジュールを使うと宣言し $CGI::POST_MAX=数値; →→モジュールの中のPOST_MAX変数にバイト数を代入する では、パッケージは何?ということになってしまうので >>パッケージというのは、変数名や関数名の衝突を防ぐ為にあると >>考えるのがよいのではないかと思います。 ということなのかな?と考えましたが、まだ理解できていないと思います。 「概念」が曖昧だと、とても気持ち悪いので納得して使いたいと いう気持ちが強くて質問したくなるのですが、よく分かっていない 状態で質問するので他の人を困らせてしまう傾向にあります。 紹介してくださったURLのひとつめを読むと >>Perlは、他のパッケージの変数によってあるパッケージが壊されるのを >>防ぐために、選択的名前空間(alternative namespace)の機構を提供しています。 >>実際のところ、グローバル変数はPerlにはないのです。 とありまして、グローバル変数がないのなら、「パッケージ変数」 ということなのかなあ?と考えたりしました。 初めにパッケージありき? それからモジュール? また分かりにくいことを書いてしまいました。 申し訳ありません。 学習していくにつれて、だんだん分かってくればいいのですが・・・ ありがとうございました。
- umasikajiro
- ベストアンサー率67% (545/803)
>$CGI::POST_MAX と1行目に記述してあります。 試してみましたがuse CGI; は下に書いてもOKのようですよ (TEST環境:Fedora5+perl5.8.8 とwinXP+activeperl perl5.8.8の2箇所にて) #! /usr/bin/perl $cgi=new CGI; $hoge = $cgi->param("hoge"); use CGI; __END__ これをコマンドラインから試してください。エラーは出ませんね? でも4行目を #use CGI; とすると 「Can't locate object method "new" via package "CGI"」とエラーに成りますね ただ、普通はuseをスクリプトの後ろのほうに書きたいのなら BEGIN{use CGI;} などとする事が多いと思いますが? BEGIN{ } のブロック文中に書かれた処理はスクリプトの下のほうにあっても 先に処理されますので、、、
お礼
umasikajiroさん、コメントありがとうございました。 use CGI;と記述が必要なのは、よくわかりました。 サンプルも試してみました。英語で出てくるエラー文って 日本語よりも分かりやすいこともあるのですね。 私は英語に堪能というわけではないのですが・・・ 元々、私の質問文が良くなかったと思います。申し訳ありません。 モジュールを利用するとき、それを使うということを記述しなくては ならないことは分かるのですが use CGI; $CGI:: この2つは何が違うのだ?というところが発端でした。 そしてパッケージとモジュールは、何が違うのだ?と悩み 調べていくと余計に分からなくなってしまったのです。 でも複数のコメントを頂いて、質問前の状態に比べると少し イメージが湧いてきました。 ありがとうございました。
お礼
qteaさん、丁寧な解説ありがとうございました。 お返事が遅くなって申し訳ありません。 モヤモヤしていた頭が、だいぶスッキリしてきました。 qteaさんが、書いてくださった、$test="main"; で始まるパッケージは、 有効範囲が、とてもよく分かりました。 例えば my $data ならば有効範囲があり、他の変数と重複しないと分かりますが、 $pkg01::data となると「何だろう?」と思っていました。 名前空間というのが、Perlでは「パッケージ」ですね。 qteaさんが紹介してくださったURLの最後、リズムファクトリーさんのサイトもとても参考になりました。 ありがとうございました。 超初心者の質問に丁寧に答えてくださり、感謝しています。