【问题标题】:Can I export constants created with enum::fields in perl?我可以在 perl 中导出使用 enum::fields 创建的常量吗?
【发布时间】:2026-01-16 17:00:02
【问题描述】:

我可以导出使用enum::fields 创建的常量吗?例如:

package XLine {
    use enum::fields qw{VAL SLOPE INTERVAL};
    use parent qw(Exporter);

    our @EXPORT = qw(VAL SLOPE INTERVAL);

    sub new {
    my $class = shift;
    my $self = bless [], $class;
    return($self);
    }
}

my $x = XLine->new();

printf("INTERVAL = %d\n", INTERVAL);

我应该使用不同的“常量”包吗?我用这个是因为我读到它很快,在这里:http://neilb.org/reviews/constants.html

【问题讨论】:

  • 通过您引用的文档,该模块的要点之一是可以对其进行子类化。但是,显示的代码混合了类和(非类)包中的东西(你不会从类中“导出”东西,而是提供 class 数据/方法)所以我不确定我得到你需要的。
  • 我理解您的评论。这正是我想要做的就是从一个类中导出一个常量。这通常不是我使用类的方式,实际上其他一切都是方法。在这种情况下,我从包中获得双重职责:一次作为类,一次作为常规包。
  • 好的。因此,VAL(等)是索引值的名称,因此可以使用$self->[VAL] 而不是使用0。因此,您真的想将它们提供给外界吗……?如果您只想“导出”一些变量(在类中定义它们并使其在外部可用),我建议您使用Readonly 和/或Const::Fast
  • 我明白你的意思是有一个单独的常量包。选择如何(而不是在哪里)执行常量是基于我提到的文章。 enum::fields 应该比 ReadonlyConst::Fast 更快。我还没有测试过。
  • "export a constant from a class" -- 这可以通过简单地定义一个类(全局)变量来完成,例如const our $VAR => 5;,并且类用户可以将其用作$ClassName::VAR。 (我使用了Const::Fast。)不需要实际导出。但是,如果您确实需要由enum::fields 去定义的VAL (等)的值,那么您似乎确实可能需要导出它们。

标签: perl constants exporter


【解决方案1】:

enum::fields 不是这里的问题。当您添加 XLine->import(qw(INTERVAL)); 或者更实际地/遵循最佳实践,将 XLine 包移动到其自己的 .pm 文件中时,该代码将起作用。

【讨论】:

  • 丹吉特。我只是通过在底部添加代码并直接运行它来测试.pm 模块。 ./XLine.pm 谢谢!
最近更新 更多