Perl有枚举types吗?

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

我正在使用的项目使用了遍布各处的string来表示通常使用C#语言中的Enum的东西。 例如,我们有一组电话号码,每个电话号码都与一个电话types(“家庭”,“工作”,“移动”等)相关联:

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

在这里使用一个只读的variables是足够的还是应该使用一个枚举? 我在CPAN上find了一个enum模块,但它似乎使用了违反Perl最佳实践之一的单词。 我对使用只读variables的想法是这样的:

 use Readonly; Readonly my $HOME => 'Home'; Readonly my $WORK => 'Work'; Readonly my $MOBILE => 'Mobile'; $phone_number->{type} = $HOME; 

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

不,没有内置的枚举结构。 Perl并没有做很多严格的input,所以我觉得实际上很less需要一个。

在我看来,你使用的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"; 

Perl实际上有一个类似于C的枚举types。试试这个细节。

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 

在这里寻找更多的细节。

请注意,这在每个Perl版本中都不受支持。 我知道v5.8.3不支持,而v5.8.7。

Perl本身不支持这个概念,但是有一些模块可以添加这个function

https://metacpan.org/pod/enum

你的方式绰绰有余。

你也可以使用Moose :: Util :: TypeConstraints创build枚举,如果你碰巧使用了Moose。 (你应该是)

我担心perl在这些枚举和命名常量上完全是截瘫:

  • 枚举和只读不是核心模块(至less在perl 5.8,我刚刚检查)。 所以这些可能在没有自由安装新模块的系统上不可用。

  • “使用常量”与“使用严格”(应该总是使用)是完全不可用的,因为它会产生一个forms可怕的错误信息:

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

让我们希望他们已经在perl 6中解决了这个混乱,如果那个能看到白天的光芒!

你应该永远记住,PBP是咨询 – 书本身。 你需要解释的准则,而不是奴隶般地采用它们。

这对我来说很好…

 use constant MYENUM => qw(ZERO ONE TWO THREE FOUR); BEGIN { eval "use constant (MYENUM)[$_] => $_;" foreach 0..(MYENUM)-1; } 

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