2010-12-09 17 views

cevap

7

(Bu official perlfaq answer, eksi sonraki düzenlemeler)

bütün bir karma işleyebilir birkaç yol vardır. keys listesini alabilir, daha sonra her bir tuştan geçebilir veya bir kerede bir anahtar/değer çiftini alabilirsin.

Tüm tuşlardan geçmek için keys function'u kullanın. Bu, hashın tüm tuşlarını ayıklar ve onları bir liste olarak size geri verir. Eğer tuşlarının listesini aldıktan sonra, karma elemanlarını işlemek önce

foreach my $key (keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

, o listeyi işleyebilir: Bu durumda, işleme koyuyoruz belirli anahtarların ile değer elde edebilirsiniz. Eğer yalnızca bazı öğeleri işlemek isteyebilirsiniz,

foreach my $key (sort keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

Veya: Örneğin, size sözcüksel sırayla işleyebilmesi için anahtarları sıralayabilirsiniz. Yalnızca metin ile başlar tuşları ile uğraşmak istiyorsanız :, sadece bu kullanarak grep seçebilirsiniz: karma çok büyükse

foreach my $key (grep /^text:/, keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

, anahtarların uzun bir liste oluşturmak istemeyebilirsiniz. eğer öyleyse

while(my($key, $value) = each(%hash)) { 
    ... 
    } 

her operatörün görünüşte rasgele sırada çiftleri döndürür: Bazı bellekten tasarruf etmek için, henüz görmedim bir çift döndüren bir defada bir anahtar-değer çiftini each() kullanarak yakalayabilir Sizin için önemli olan siparişler, anahtarlar yöntemine bağlı kalmanız gerekir.

each() operatörü biraz zor olabilir. Perl'in tüm öğeleri yeniden ifşa ettikten sonra bazı çiftleri atlamadan veya yeniden işlemeden kullanmadan, hash tuşlarını ekleyemez veya silemezsiniz. Ayrıca, bir karma yalnızca bir yineleyici vardır, bu nedenle aynı karede keys, values veya each kullanırsanız yineleyiciyi sıfırlayabilir ve işleminizi bozabilirsiniz. Daha fazla ayrıntı için perlfunc numaralı telefondan each entry'a bakın.

İlgili konular