2010-01-25 37 views
5

Tôi cần trả lại giá trị enum trong perl, làm cách nào tôi có thể thực hiện việc này?Làm cách nào để tạo kiểu enum trong Perl?

kéo từ chủ đề này: Does Perl have an enumeration type?

use strict; 

use constant { 
    HOME => 'home', 
    WORK => 'work', 
    MOBILE => 'mobile', 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

nhưng không nên chỉ số lợi nhuận này 0? hoặc tôi hiểu điều này sai?

EDIT:

Vì vậy, điều gì đó như thế này có thể mong đợi hơn đối với loại enum?

use strict; 

use constant { 
    HOME => 0, 
    WORK => 1, 
    MOBILE => 2, 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

EDIT # 2

Ngoài ra tôi muốn kiểm tra vào tùy chọn chọn nhưng vượt qua trở lại Lời thay vì sau đó giá trị. Làm thế nào tôi có thể có tốt nhất của cả hai ví dụ?

@VALUES = (undef, "home", "work", "mobile"); 

sub setValue { 

if (@_ == 1) { 
    # we're being set 
    my $var = shift; 
    # validate the argument 
    my $success = _validate_constant($var, \@VALUES); 

    if ($success == 1) { 
     print "Yeah\n"; 
    } else { 
     die "You must set a value to one of the following: " . join(", ", @VALUES) . "\n"; 
    } 
} 
} 

sub _validate_constant { 
# first argument is constant 
my $var = shift(); 
# second argument is reference to array 
my @opts = @{ shift() }; 

my $success = 0; 
foreach my $opt (@opts) { 
    # return true 
    return 1 if (defined($var) && defined($opt) && $var eq $opt); 
} 

# return false 
return 0; 
} 
+0

Ý bạn là gì nếu chỉ mục * 0 *? –

+3

Bạn đã đọc câu trả lời được chấp nhận cho câu hỏi bạn đã liên kết chưa? Đặc biệt là phần nói rằng Perl không * không * có một loại enum? Nếu vậy, bạn đang mong đợi "chỉ số 0" đến từ đâu? – friedo

+0

@friedo Tôi đồng ý với bạn, tôi chỉ muốn đảm bảo rằng tôi hiểu được quyền này. Tôi cần phải có tùy chọn để thiết lập HOME nhưng trả về 0. Chỉ cần thay đổi giá trị thành 0 công việc? Xem Edit –

Trả lời

2

Một hằng không phải là một enum (trong perl, hoặc bất kỳ ngôn ngữ tôi biết)

Không, bởi vì ở đây những gì bạn đang làm được chèn trong bảng biểu tượng một mối liên hệ giữa phím HOME và chữ số Home theo nghĩa đen, số này cũng được gọi là bareword theo cách nói perl. Bảng biểu tượng được thực hiện với một băm, và không có số tương đương với các khóa của nó và thứ tự chúng được thêm vào.

Trong ví dụ của bạn, những gì bạn đang làm là đặt $perl_number->{type} = 'Home' và sau đó in ra $phone_number->{type}.

+0

Gọi bảng biểu tượng không thực sự quan trọng. Ít khó hiểu hơn khi mọi người nói rằng bạn tạo một chương trình con không nhận đối số và trả về một giá trị không đổi. Để những cái đầu ra khỏi nó. –

+0

@brian Đây là câu trả lời của tôi, bạn có thể tự do rời khỏi bằng cách sử dụng tùy chọn "Thêm câu trả lời khác" ở cuối màn hình của bạn. –

+1

Tất nhiên, tôi đã thêm câu trả lời của mình. Tuy nhiên, tôi cũng giúp mọi người tinh chỉnh và sửa câu trả lời của riêng họ. Biểu tượng bảng là một sự nhầm lẫn không cần thiết ở đây, và bạn xuất hiện một chút nhầm lẫn về những gì đang thực sự xảy ra. Bạn có thể cung cấp câu trả lời tốt hơn nếu bạn tập trung nhiều hơn cho họ bằng cách bỏ qua các chi tiết không cần thiết. –

2

Nếu bạn muốn có enums, hãy sử dụng mô-đun enum.

+0

Đọc chủ đề tài liệu tham khảo này, theo câu hỏi. –

+1

Đúng, đã đọc rồi. Nó không thay đổi câu trả lời của tôi. –

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