Perl是否有枚举类型?

时间:2009-01-23 16:57:38

标签: perl enums

Perl是否具有符合最佳实践的枚举类型,或者更重要的是,它是否需要一个?

我正在工作的项目使用遍布各处的字符串来表示通常在C#等语言中使用Enum的内容。例如,我们在一组哈希中有一组电话号码,每个电话号码与电话类型(“主页”,“工作”,“移动”等)相关联:

$phone_number->{type} = 'Home';

在这里使用只读变量集还是使用Enum是否足够?我找到了enum module on CPAN,但它似乎使用了违反Perl Best Practices之一的单词。我对使用read-only variables的看法是这样的:

use Readonly;

Readonly my $HOME   => 'Home';
Readonly my $WORK   => 'Work';
Readonly my $MOBILE => 'Mobile';

$phone_number->{type} = $HOME;

这是一种好方法还是有更好的方法?

6 个答案:

答案 0 :(得分:41)

不,没有内置的枚举构造。 Perl并没有做很多严格的打字,所以我认为实际上并不需要一个。

在我看来,您使用的Readonly方法是可靠的。

还有更传统的constant编译指示。

use constant {
    HOME   => 'Home',
    WORK   => 'Work',
    MOBILE => 'Mobile',
};

$phone_number->{type} = HOME;

在幕后,它为每个返回值的常量设置一个函数,就像这样。

sub HOME () { 'Home' }

除非您想利用该属性,否则我会坚持Readonly,例如:

package Phone::Type;

use constant {
    HOME => 'Home',
    #...
};

package main;

print Phone::Type->HOME, "\n";

答案 1 :(得分:22)

实际上Perl确实有一个像C一样的枚举类型。试试这个细节。

perldoc enum

例如:

use enum qw(HOME WORK MOBILE);

现在我们有:

HOME == 0
WORK == 1
MOBILE == 2

您也可以自己设置权限:

use enum qw(HOME=0 WORK MOBILE=10 FAX);

现在我们有:

HOME == 0
WORK == 1
MOBILE == 10
FAX == 11

查看here了解更多详情。

请注意,每个Perl版本都不支持此功能。我知道v5.8.3不支持它,而v5.8.7则支持它。

答案 2 :(得分:11)

Perl本身不支持该概念,但有些模块可以添加此功能

https://metacpan.org/pod/enum

答案 3 :(得分:8)

你的方式绰绰有余。

如果您正好使用Moose,也可以使用Moose :: Util :: TypeConstraints创建枚举。 (你应该这样。)

答案 4 :(得分:5)

对于这些枚举和命名常量,我担心perl是完全截瘫的:

  • 枚举和Readonly不是核心模块(至少在perl 5.8,我刚刚检查过)。因此,在没有安装新模块的自由的系统上,这些可能是不可用的。

  • “使用常量”和“使用严格”(应该总是使用)完全无法使用,因为它会生成一堆形式的可怕错误消息:

    使用“严格潜艇”时不允许使用Bareword“FRED”

让我们希望他们已经在perl 6中解决了这个烂摊子,如果它能看到光明的那一天!

答案 5 :(得分:0)

这对我很有用......

use constant MYENUM => qw(ZERO ONE TWO THREE FOUR);

BEGIN {
    eval "use constant (MYENUM)[$_] => $_;" foreach 0..(MYENUM)-1;
}

然后,您可以使用ZERO, ONE, TWO等作为常量,并使用(MYENUM)[$value]打印出其符号名称。