Program Club

Perl에 열거 형이 있습니까?

proclub 2020. 12. 12. 11:40
반응형

Perl에 열거 형이 있습니까?


Perl 에 모범 사례를 준수 하는 열거 형 있습니까? 아니면 더 중요한 것은 필요합니까?

내가 일하고있는 프로젝트는 어디에서나 문자열을 사용하여 일반적으로 C #과 같은 언어로 Enum을 사용하는 것을 나타냅니다. 예를 들어, 해시 배열에 전화 번호 세트가 있으며, 각각 전화 유형 ( "집", "직장", "모바일"등)과 연결되어 있습니다.

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

여기에서 읽기 전용 변수 세트를 사용하는 것으로 충분합니까 아니면 Enum을 사용해야합니까? enumCPAN 에서 모듈을 찾았 지만 Perl Best Practices 중 하나를 위반하는 단어를 사용하는 것 같습니다 . 읽기 전용 변수 사용에 대한 내 생각 은 다음과 같습니다.

use Readonly;

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

$phone_number->{type} = $HOME;

이것이 좋은 접근 방식입니까 아니면 더 나은 방법이 있습니까?


아니요, 내장 열거 형 구조가 없습니다. Perl은 엄격한 타이핑을 많이하지 않으므로 실제로 입력 할 필요가 거의 없다고 생각합니다.

제 생각에는 Readonly당신이 사용한 접근 방식은 견고합니다.

더 전통적인 constantpragma도 있습니다.

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와 같은 enum 유형을 가지고 있습니다. 자세한 내용을 보려면 이것을 시도하십시오.

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

여기에 자세한 내용은.

모든 버전의 Perl에서 지원되는 것은 아닙니다. v5.8.3은 지원하지 않지만 v5.8.7은 지원합니다.


Perl doesn't support the concept natively but there are modules to add this functionality

https://metacpan.org/pod/enum


Your way is more than adequate.

You can also create enums with Moose::Util::TypeConstraints, if you happen to be using Moose. (Which you should be.)


I'm afraid perl is completely paraplegic when it comes to these enums and named constants:

  • enum and Readonly are not core modules (at least at perl 5.8, which I just checked). So these may be unavailable on a system where one has no freedom to install new modules.

  • "use Constant" with "use strict" (which one should always use) is completely unusable, as it generates a load of horrible error messages of the form:

    Bareword "FRED" not allowed while "strict subs" in use

그들이 펄 6에서이 엉망진창을 정리했으면 좋겠습니다.


이것은 나를 위해 잘 작동했습니다 ...

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

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

그런 다음 ZERO, ONE, TWOetc를 상수 로 사용 하고를 사용하여 기호 이름을 인쇄 할 수 있습니다 (MYENUM)[$value].

참고 URL : https://stackoverflow.com/questions/473666/does-perl-have-an-enumeration-type

반응형