Home Articles

Perl是否有枚举类型?

Asked
Viewed 930 times
54

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 Answers

  • 40

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

    在我看来,你使用的Readonly方法是可靠的 .

    还有更传统的constant pragma .

    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";
    
  • 20

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

    perldoc enum

    例如:

    use enum qw(HOME WORK MOBILE);
    

    现在我们有:

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

    您也可以自己设置indeces:

    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则支持它 .

  • 11

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

    https://metacpan.org/pod/enum

  • 8

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

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

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

  • 5

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

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

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

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

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

  • 0

    你的方式绰绰有余 .

    如果您正好使用Moose,也可以使用Moose :: Util :: TypeConstraints创建枚举 . (你应该是哪个 . )

Related