2010-09-13 17 views
28

Tôi muốn đại diện cho một tập hợp trong Perl. Những gì tôi thường làm là sử dụng hàm băm với một số giá trị giả, ví dụ:Tôi làm cách nào để đại diện cho các bộ trong Perl?

my %hash=(); 
$hash{"element1"}=1; 
$hash{"element5"}=1; 

Sau đó, sử dụng if (defined $hash{$element_name}) để quyết định xem phần tử có nằm trong tập hợp hay không.

Đây có phải là thực tiễn phổ biến không? Bất kỳ đề xuất về cải thiện điều này?

Ngoài ra, tôi có nên sử dụng defined hoặc exists không?

Cảm ơn bạn

Trả lời

10

Sử dụng một trong nhiều bộ Mô-đun trên CPAN. Đánh giá từ ví dụ của bạn, Set::Light hoặc Set::Scalar có vẻ phù hợp.


Tôi có thể bảo vệ lời khuyên này với các đối số thông thường ủng hộ CPAN (bỏ qua các hiệu ứng sức mạnh tổng hợp có thể có).

  1. Làm sao chúng ta biết rằng việc tra cứu là tất cả những gì cần thiết, cả hiện tại và trong tương lai? Kinh nghiệm dạy rằng even the simplest programs expand and sprawl. Sử dụng một mô-đun sẽ dự đoán điều đó.
  2. API tốt hơn nhiều để bảo trì hoặc những người cần đọc và hiểu mã nói chung, hơn là triển khai đặc biệt vì nó cho phép suy nghĩ về các vấn đề một phần ở các mức trừu tượng khác nhau.
  3. Liên quan đến điều đó, nếu nó chỉ ra rằng chi phí là không mong muốn, nó rất dễ dàng để đi từ một mô-đun đơn giản bằng cách loại bỏ indirections hoặc paring cấu trúc dữ liệu và mã nguồn. Nhưng mặt khác, nếu người ta cần nhiều tính năng hơn, thì sẽ khó khăn hơn để đạt được một cách khác.
  4. Mô-đun CPAN đã được thử nghiệm và ở một mức độ nào đó được gỡ rối kỹ lưỡng, có lẽ API cũng đã trải qua các bước cải tiến theo thời gian, trong khi với ad-hoc, programmers usually implement the first design that comes to mind.

Hiếm khi nó chọn ra một mô-đun ở đầu là lựa chọn sai.

+1

Có điều gì đó cung cấp cho bạn ngoài chi phí không? Đặt hoạt động hay gì đó? Nếu tất cả những gì tôi đang làm là kiểm tra sự tồn tại của một vật phẩm trong một bộ, tại sao tôi lại sử dụng một thư viện để làm điều gì đó mà ngôn ngữ đó đã làm rất tốt? –

+0

Bất kỳ đề xuất nào về các mô-đun hỗ trợ bộ nhóm? –

+0

Bộ các bộ âm thanh giống như một công việc cho Set :: Object, có thể tạo tổ. – daxim

0

Đó là cách tôi luôn làm. Tôi có xu hướng sử dụng exists thay vì defined nhưng cả hai đều nên làm việc trong ngữ cảnh này.

38

Có, xây dựng bộ băm theo cách đó là một thành ngữ phổ biến. Lưu ý rằng:

my @keys = qw/a b c d/; 
my %hash; 
@hash{@keys} =(); 

là thích hợp hơn để sử dụng 1 như giá trị vì undef chiếm ít hơn đáng kể không gian. Điều này cũng buộc bạn phải sử dụng exists (đó là sự lựa chọn đúng anyway).

+0

+1 Cảm ơn. Vui lòng xem câu hỏi liên quan về "tập hợp sâu": http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash –

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