2010-09-13 16 views
28

Perl'de bir grubu temsil etmek istiyorum. Ne zaman yaptığım Sonra bir eleman kümesi olup olmadığına karar vermek if (defined $hash{$element_name}) kullanan bazı kukla bir değere sahip bir karma, ör .:Perl'deki kümeleri nasıl temsil edebilirim?

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

kullanıyor.

Bu yaygın bir uygulamadır mı? Bunu geliştirmek için herhangi bir öneriniz var mı?

Ayrıca defined veya exists mu kullanmalıyım?

size

cevap

10

kullanın CPAN birçok Seti modüllerden biri ederiz. Örneğinizden bakarak, Set::Light veya Set::Scalar uygun görünüyor. Bu tavsiyeyi, CPAN (olası sinerji etkilerini dikkate almayan) argümanlarıyla savunabilirim.

  1. Hem şimdi, hem de gelecekte aranmanın gerekli olduğunu nasıl bilebiliriz? Deneyim, even the simplest programs expand and sprawl'un öğretildiğini öğretir. Bir modül kullanmak bunu tahmin ederdi.
  2. Bir API, bakım ya da genel olarak kodun okunması ve anlaşılması gereken kişiler, çok farklı soyutlama düzeylerindeki kısmi sorunları düşünmeye olanak tanıdığından, anlık bir uygulamadan çok daha iyidir.
  3. Bununla ilgili olarak, ek yükün istenmeyen bir durum olduğu ortaya çıkıyorsa, bir modülden basit bir şekilde indireklerin kaldırılması veya veri yapılarının ve kaynak kodunun ayrıştırılması kolaylaşır. Ancak öte yandan, eğer daha fazla özelliğe ihtiyaç duyulursa, diğer yöne ulaşmak nispeten daha zordur.
  4. CPAN modülleri zaten test edilmiştir ve bir dereceye kadar tamamen hata ayıklanmıştır, belki de API zaman içinde iyileştirme adımlarına tabi tutulurken, programmers usually implement the first design that comes to mind.

Nadiren, başlangıçta bir modül seçmek yanlış seçimdir.

+1

Sizi başkasının dışında bırakacak bir şey var mı? İşlemleri falan mı? Yaptığım tek şey bir kümedeki bir öğenin varlığını kontrol etmekti, neden zaten çok iyi bir dil yapmak için bir kütüphane kullanmalıyım? –

+0

Set kümelerini destekleyen modüller hakkında herhangi bir öneriniz var mı? –

+0

Kümeler, kümeleriyle birlikte yerleştirilebilen Set :: Object için bir işe benzer küme kümeleridir. – daxim

0

Her zaman böyle yaptım. defined yerine exists kullanmayı tercih ederim ancak ikisi de bu bağlamda çalışmalıdır.

38

Evet, yapı karma setleri bu şekilde ortak bir deyimdir.

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

undef önemli ölçüde daha az yer kaplar, çünkü değeri olarak 1 kullanarak tercih edilir: unutmayın. Bu ayrıca sizi exists'u kullanmaya zorlar (yine de doğru seçimdir).

+0

+1 Teşekkürler. "Derin setler" ile ilgili ilgili soruya bakınız: http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash –

İlgili konular