【Perl5.0】Perl初心者です。

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]------------------------------

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/07/18 23:42:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント60pt

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 コマンドのパスの指定は要らんぞ。

id:memamii

回答ありがとうございます。

当初は、後者のパターンで組んでいたのですが、毎回x::と打つのが面倒になってきまして、どうにかならないものかと思ってました。

みなさんenumモジュールはあまり使われないのでしょうか?

とにかく、ありがとうございました。

2009/07/17 11:52:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません