ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-05-11

[][][][]Re: package宣言をして名前空間を定義する 20:24 Re: package宣言をして名前空間を定義する  - ishiducaの日記 を含むブックマーク はてなブックマーク - Re: package宣言をして名前空間を定義する  - ishiducaの日記 Re: package宣言をして名前空間を定義する  - ishiducaの日記 のブックマークコメント

端折りすぎました。

package宣言をして名前空間を定義する(はじめてのモジュール その2)では、以下のコードの中で「our」を使っていたんですが、モジュールファイル内で作ったグローバル変数をスクリプト内で使うためのインポート/エクスポートの処理が書いてありませんでした。このままでは、eto.pl ではグローバル変数のエラーが返ってしまいます。kits さんがはてブで「ourによる変数名のパッケージ名省略が可能なのは、あくまで宣言したブロック(ファイル)の範囲内のみ」とご指摘くださいました。

ex: ishiduca.pm(モジュールファイル)このままだと、$Year は eto.pl では使えない

package ishiduca; # モジュールファイル名でpackage宣言する
use strict;
our( $Year ); # 明示的には$ishiduca::Year
$Year = 1919;
# 以下省略
1;

ex: eto.pl(モジュールを使用するスクリプト)

#!/usr/bin/perl -wl
use strict;
use ishiduca;

print $Year; # ishiduca.pm でour(グローバル変数)宣言されているので、
             # エラーは出ない
             # 明示的にはprint $ishiduca::Year;

端折った部分を加えるとこう

ishiduca.pm

package ishiduca;
use strict;
our( $Year );
$Year = 1919;

# 以下、端折った部分
our(@ISA, @EXPORT);

require Exporter;
@ISA = qw( Exporter );

@EXPORT = qw( $Year );

1;

もしくは、eto.pl で、明示的に $ishiduca::Year とする

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090511

2009-05-06

[][][]package宣言をして名前空間を定義する(はじめてのモジュール その2) 14:26 package宣言をして名前空間を定義する(はじめてのモジュール その2) - ishiducaの日記 を含むブックマーク はてなブックマーク - package宣言をして名前空間を定義する(はじめてのモジュール その2) - ishiducaの日記 package宣言をして名前空間を定義する(はじめてのモジュール その2) - ishiducaの日記 のブックマークコメント

注:この記事には、間違っているところがあります。それは僕の理解不足によるところですが、ありがたいことに kits さんが、はてブでご指摘くださいました。ここでは、どこが間違っているのかは、明らかにしません。この記事の最後に間違えを訂正した記事へのリンクを張っておきますので、この記事を読み終えた後に続けて読んでいただけると幸いです。また、この記事へのツッコミも歓迎します。(2009.05.10 追記)


僕が購読している『ミニマルPerl』では詳しい説明が省略されているので、web上の文献を横断的に読んで箇条書きにしてみようと思ったけど、なかなか覚えきれないので、モジュール作成に関連したところだけを箇条書きにしてみる。

  • モジュール(ファイル)を作る時に、最初に宣言する。
  • package Module_name は Module_name の名前空間を定義する。
  • モジュール定義を保持するファイルでは、Module_nameはファイル名に対応する名前とパスを使用する。例えばMoudule_name を ishiduca と定義した場合は、ishiduca.pmだし、ishiduca::nengo とした場合は、ishiducaというディレクトリ下の nengo.pm。
  • 宣言した後に使われる(名前空間内で定義された)変数、サブルーチンは明示的にはModule_name::変数名、Module_name::サブルーチン名となる。
  • 宣言しない場合は暗黙的に package main される。
  • package名前空間の有効範囲は、package宣言をした位置から別のpackage文が現れるまで(ブロック内で宣言した場合は、そのブロック内)
  • package名前空間内でのみ使用する変数はmy宣言。他の名前空間でも使用する場合はour宣言する。

ex: ishiduca.pm(モジュールファイル)

package ishiduca; # モジュールファイル名でpackage宣言する
use strict;
our( $Year ); # 明示的には$ishiduca::Year
$Year = 1919;
# 以下省略
1;

ex: eto.pl(モジュールを使用するスクリプト)

#!/usr/bin/perl -wl
use strict;
use ishiduca;

print $Year; # ishiduca.pm でour(グローバル変数)宣言されているので、
             # エラーは出ない
             # 明示的にはprint $ishiduca::Year;

出力

1919

色々端折ってるからこんなに単純じゃないけど、イメージとして。


この記事には続き(Re: package宣言をして名前空間を定義する)があります。続けて読んでいただけると幸いです。



参照にした

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090506