2009-01-23 38 views
51

Perl có kiểu liệt kê tuân thủ các phương pháp hay nhất hoặc quan trọng hơn không, liệu nó có cần một loại không?Liệu Perl có một kiểu liệt kê?

Dự án tôi đang sử dụng một chuỗi sử dụng khắp nơi để biểu thị những thứ thường sử dụng Enum bằng ngôn ngữ như C#. Ví dụ, chúng ta có một tập hợp các số điện thoại trong một mảng băm, mỗi liên kết với một loại điện thoại ("Home", "làm việc", "di động", vv):

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

Nó sẽ là đủ thế nào để sử dụng một tập chỉ đọc các biến ở đây hoặc nên một Enum được sử dụng? Tôi đã tìm thấy một enum module on CPAN nhưng nó xuất hiện để sử dụng các từ trống vi phạm một trong các Perl Best Practices. Suy nghĩ của tôi về việc sử dụng read-only variables đi một cái gì đó như thế này:

use Readonly; 

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

$phone_number->{type} = $HOME; 

Đây có phải là một cách tiếp cận tốt hay là có một cách tốt hơn?

Trả lời

39

Không, không có cấu trúc tích hợp sẵn. Perl không làm nhiều việc đánh máy chặt chẽ, vì vậy tôi nghĩ thực sự ít cần thiết cho một.

Theo ý kiến ​​của tôi, phương pháp tiếp cận Readonly bạn đã sử dụng là chắc chắn.

Ngoài ra còn có pragma truyền thống hơn.

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

$phone_number->{type} = HOME; 

Phía sau hậu trường, nó thiết lập hàm cho mỗi hằng số trả về giá trị, như vậy.

sub HOME() { 'Home' } 

Tôi muốn gắn bó với Readonly trừ khi bạn muốn tận dụng lợi thế của tài sản đó, ví dụ:

package Phone::Type; 

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

package main; 

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

Đối với độ nghiêm ngặt, có sub HOME() {'home'} được tạo ra sau cảnh. –

+0

Khi bạn có một chương trình con có trong Điện thoại :: Loại enum làm đối số, làm thế nào để bạn thực hiện kiểm tra động trên đối số chương trình con là Điện thoại :: Loại kiểu enum, không phải chuỗi, không phải số ... –

+0

Chỉ cần làm rõ sub HOME () {'home'} và sử dụng hằng số { HOME => 'Trang chủ', WORK => 'Cơ quan', MOBILE => 'Di động', }; giống nhau không? sau này tạo ra (đằng sau hậu trường) mã? –

8

cách của bạn là nhiều hơn cần thiết.

Bạn cũng có thể tạo enums với Moose :: Util :: TypeConstraints, nếu bạn tình cờ sử dụng Moose. (Những gì bạn nên.)

17

Perl không trên thực tế có một kiểu enum như trong C. Hãy thử điều này để biết chi tiết.

perldoc enum

Ví dụ:

use enum qw(HOME WORK MOBILE); 

Bây giờ chúng ta có:

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

Bạn cũng có thể thiết lập các indeces mình:

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

Bây giờ chúng ta có:

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

Look here để biết thêm chi tiết.

Lưu ý rằng điều này không được hỗ trợ trong mọi phiên bản của Perl. Tôi biết rằng v5.8.3 không hỗ trợ nó, trong khi v5.8.7 thì không.

+8

Inasmuch như tôi có thể nói, 'sử dụng enum' là một mô-đun CPAN, không phải là một phần của ngôn ngữ cốt lõi. –

+0

@paul nathan ... Tôi không chắc chắn rằng nên loại trừ một người nào đó sử dụng nó mặc dù. Một số lượng lớn các tính năng perl không phải là một phần của lõi. –

+0

Tất cả các kỹ thuật khác là một nỗi đau cho tôi. Tôi đã có rất nhiều biến và phải gắn nhãn mỗi biến. THÌ - ứng dụng bên ngoài của tôi đã thay đổi định dạng của chúng, yêu cầu thêm một định nghĩa vào BEGINNING của danh sách - vì vậy tôi phải đổi lại mọi thứ! Enum mô-đun chắc chắn là con đường để đi !! – Brad

2

Bạn nên luôn nhớ rằng PBP là tư vấn - chính cuốn sách đó càng nhiều. Bạn cần phải giải thích các hướng dẫn hơn là không chấp nhận chúng.

+0

downvoted bởi vì, trong khi điều này là đúng, nó cũng là khá chủ đề –

+2

trả lời bình luận của riêng tôi: Tôi sai, câu trả lời này không hoàn toàn tắt chủ đề; nó chỉ thể hiện rõ ràng. một câu trả lời tốt hơn/hữu ích hơn sẽ thảo luận về ưu và nhược điểm của barewords và tại sao mô-đun enum nên hoặc không nên sử dụng chúng. –

+0

nó không phải là vấn đề của/tắt chủ đề. đây là một bình luận, không phải là một câu trả lời, vì vậy nên đã được nhập vào như vậy – ysth

5

Tôi perl sợ là hoàn toàn hành tinh Pandora để khi nói đến những sự đếm và đặt tên hằng:

  • enum và chỉ đọc không phải là module lõi (ít nhất là ở perl 5,8, mà tôi chỉ cần kiểm tra). Vì vậy, chúng có thể không có sẵn trên một hệ thống mà ở đó người ta không có quyền tự do cài đặt các mô-đun mới. trong khi

    bareword "Fred" không được phép ":

  • "sử dụng liên tục" với "sử dụng nghiêm ngặt"(mà người ta luôn luôn nên sử dụng) là hoàn toàn không sử dụng được, vì nó tạo ra một tải trọng của các thông báo lỗi khủng khiếp của các hình thức người đăng ký nghiêm ngặt "đang sử dụng

Hãy hy vọng họ sắp xếp ra mớ hỗn độn này trong perl 6, nếu điều đó từng thấy ánh sáng ban ngày!

+1

Hằng số không in cảnh báo, và không trong 5.8 hoặc: 'perl -e' sử dụng qw nghiêm ngặt (subs); sử dụng hằng số FRED => q {fred}; printf qq {Perl% vd \ nConstant là% s \ n}, $^V, FRED'' cho 'Perl 5.8.4 Hằng số là fred' và không có cảnh báo. (Phải, tôi nhận ra câu trả lời này là vài năm tuổi ...) – derobert

0

này làm việc độc đáo cho tôi ...

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

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

Sau đó bạn có thể sử dụng ZERO, ONE, TWO vv như hằng số và in ra tên mang tính biểu tượng của họ sử dụng (MYENUM)[$value].

Các vấn đề liên quan