PerlでC言語にあるようなenumを使用したくて、以下のようにenumを宣言したファイル(x.pm)を作成しました。
しかし、別のパッケージ(y.pm)からそれを使用しようとするとコンパイルエラーとなってしまいます。
どのようにすれば解決できるのでしょうか?
よろしくお願いします。
-----------[x.pm]------------------------------
#!/usr/local/bin/perl
use strict;
use enum qw(
:DataType_=0 One Two Three
);
return 1;
-----------[x.pm]------------------------------
-----------[y.pm]------------------------------
#!/usr/local/bin/perl
use strict;
use x;
package y;
sub test1
{
my $z = {
type => DataType_One,
size => 1};
}
return 1;
-----------[y.pm]------------------------------
2種類解決策がある。
『続・初めてのPerl』15章 Exporter - ケーズメモ
正攻法は Export で利用側の名前空間で使用できるようにすること。
x.pm ファイルの方はだいたいこんな感じ。
package x; use strict; use warnings; require Exporter; use base qw/Exporter/; use enum qw( :DataType_=0 One Two Three ); our @EXPORT = qw( DataType_One DataType_Two DataType_Three ); 1;
enum モジュールは使ったこと内から、@EXPORT に代入する値はちょっと自信ないな。
ようは呼び出し元で使いたい名前を指定してやるだけなんだが。
まぁその辺は適当に試してくれ。
2つめは x.pm でパッケージを指定しておき、呼び出し側ではパッケージ名指定で使用すること。
x.pm
package x; use strict; use warnings; use enum qw( :DataType_=0 One Two Three ); 1;
y.pm
package y; use strict; use warnings; sub test1 { my $z = { type => x::DataType_One, size => 1}; } 1;
とこんなところだ。
あと細かいところだが、実行ファイルとして直接呼び出されるわけではない .pm ファイルに、
perl コマンドのパスの指定は要らんぞ。
回答ありがとうございます。
当初は、後者のパターンで組んでいたのですが、毎回x::と打つのが面倒になってきまして、どうにかならないものかと思ってました。
みなさんenumモジュールはあまり使われないのでしょうか?
とにかく、ありがとうございました。