2013-09-26 5 views
11

mam następujące hash:W języku Perl, dlaczego łączenie skrótu z ciągiem daje wynik frapujący?

my %villains = { 
    "Boba" => "Fett", 
    "Darth" => "Vader", 
    "Moff" => "Tarkin", 
} 

I następnie wydrukować go tak:

print "".%villains; 

pojawia się następujący komunikat:

1/8 

Co semantyka w Perlu tak się stało?

Dziękujemy!

+6

Należy pamiętać, że przypisano tu jeden klucz z referencją i bez wartości. Umieszczenie zawartości skrótu w nawiasach klamrowych ('{' i '}') przypisuje _hash reference_, a nie hash. Deklarujesz hash i przekazujesz mu _hash reference_. Więc nigdy nie dostaniesz więcej niż jednego wiadra wypełnionego. –

+0

To jest bardzo dobre pierwsze pytanie. Dobra robota! – simbabque

Odpowiedz

13

Dokonujesz oceny wartości mieszania w kontekście skalarnym. Kiedy to zrobisz, to faktycznie zwraca część liczby wiader dotkniętych przez całkowitą liczbę segmentów, chyba że wartość mieszania nie została użyta, w którym to przypadku wartość jest fałszywa. Zobacz this perldoc, aby uzyskać więcej informacji (pod koniec sekcji).

4

If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash. This is pretty much useful only to find out whether Perl's internal hashing algorithm is performing poorly on your data set.

To może korzystać z niektórych wyjaśniając dla każdego nieznanego z wewnętrznymi hash: Gdy elementy są dodawane do mieszania, są one ułożone w wiadrach w oparciu o algorytm mieszający, dzięki czemu można je odzyskać więcej wydajnie.

Przykład

Gromadzisz autka. Aby łatwo znaleźć swoje samochody, zdecydowałeś się umieścić je w różnych pojemnikach na podstawie koloru. Masz wiadra dla Red, Żółty, Zielonej, Niebieski i Czarnych kolorowe samochodów.

dodać nową Zieloną Ford Mustang do swojej kolekcji tak to idzie w Zielonej wiadra. Gdy następnym razem będziesz chciał znaleźć ten samochód, możesz przejść bezpośrednio do wiadra Green i wybrać mniejszy fragment do przeszukiwania.

W tym przykładzie kolekcja samochodów to hash, każdy samochód to hash entry, a kolor to hashing algorithm. Ponieważ kolekcja zawiera również czerwone, niebieskie i czarne samochody, są one rozmieszczone dość sprawnie, przy użyciu 4/5 z wiader.

Jeśli jednak używałbyś tego systemu do zbierania czerwonych samochodów, algorytm mieszający byłby bardzo nieefektywny. Używałby on tylko jednego kubka, a znalezienie konkretnego samochodu wymagałoby przeszukiwania całej kolekcji.

Powiązane problemy