在Perl中使用enum :: fields创建的奇怪输出常量

时间:2019-07-19 01:14:12

标签: perl enums exporter

我创建了两个测试模块,X.pmX2.pmX.pm模块起作用。 X2.pm模块没有,至少不像我期望的那样。

X.pm

package X {

    use enum::fields qw(I_VAL);
    use parent qw(Exporter);

    our @EXPORT = qw(I_VAL);
}

X2.pm

package X2 {

    our @EXPORT = qw(I2_VAL);

    use enum::fields (@EXPORT);
    use parent qw(Exporter);

}

测试程序为:

use X;
use X2;

printf("I_VAL = %d\n", I_VAL);
printf("I2_VAL = %d\n", I2_VAL);

输出为:

bash$ ./tmp/testit
I_VAL = 0
Undefined subroutine &X2::I2_VAL called at /home/bennett/tmp/testit line 15.

真实的项目有几十个enum::fields,而X2.pm是我试图使枚举与导出保持同步的方式。

我的问题是这些:

  • X2为什么不起作用?是否在出口(进口)之前 enum::fields运行吗?
  • 我该怎么办?

1 个答案:

答案 0 :(得分:2)

use语句在编译后立即执行,因此

use enum::fields (@EXPORT);

之前执行
our @EXPORT = qw(I2_VAL);

这将起作用:

package X3;

use strict;
use warnings;

my @enum; BEGIN { @enum = qw( I2_VAL ); }

use Exporter     qw( import );
use enum::fields @enum;

our @EXPORT = @enum;

1;