2012-02-21 19 views
10

Zdaję sobie sprawę, że przydatna jest ocena tablicy w Perlu w kontekście skalarnym: daje ona # elementów.Jaki jest powód, aby kiedykolwiek oceniać hash w Perlu w kontekście skalarnym?

Ale jaki jest praktyczny użytek z możliwości oceny skrótu w kontekście skalarnym? na przykład

  • my $scalar_value = %hash;

  • scalar(%hash)

O ile mi zrozumieć, wytwarza ciąg jak „3/4” daje pewne informacje na temat budowy wewnętrznej hash, który wydaje się być użyteczne tylko do debugowania.

+0

Jaka jest różnica? –

+3

Tablica jest zmienną ze znakiem '@ ', lista jest serią elementów w kodzie źródłowym. w tym kodzie '@array = (1, 2, 3)', '(1, 2, 3)' jest listą, a '@ tablica' jest zmienną tablicową. perlfaq4 zawiera więcej informacji: http://perldoc.perl.org/perlfaq4.html#Jak-jest-znajduje się-różnica-na-pole-a-lista- i -anary? –

+1

Ale czy nie mogę napisać 'skalar (1,2,3,4)'? jeśli tak, to "lista" była poprawna na podstawie twojego wyciągu, nie? –

Odpowiedz

14

Tworzy wartość, która może być używana jako flaga PRAWDA/FAŁSZ w celu sprawdzenia, czy skrót jest pusty (brak klawiszy).

Jako przykład:

if (%hash) { 
    print "Hash has elements\n"; 
} else { 
    print "Hash is empty\n"; 
} 

if wymusza ekspresji do skalarnej ramach z powodu jego zastosowania jako logicznej ekspresji.

Jest to bardzo podobna koncepcja użyciem @array w kontekście skalarnym do testowania pustki:

if (@array) { 
    # NOT empty! 
} 
+0

Gdzie "pusty" oznacza "nie ma kluczy". – tchrist

+0

@tchrist - dodałem, że jako wyjaśnienie, ale jestem w niewielkiej straty, jak inaczej "puste hash" mogą być interpretowane? – DVK

+3

To dlatego, że ludzie idą dziwakiem, czy '% h = (foo => undef)' oznacza coś innego niż skalar. Tak samo jak oni dziwią się '@ = (undef)'. Każdy z nich ma jeden prawidłowy indeks, chociaż nie ma żadnej prawidłowej wartości. Więc liczy się jego keycount. – tchrist

1

Skalar (% hash) pozwala sprawdzić, czy algorytm mieszania działa poprawnie. Jeśli masz 1000 kluczy i widzisz coś takiego jak 2/16, oznacza to, że wszystkie klucze są rozdzielone tylko na 2 z 16 przydzielonych wiader. Oznacza to, że wszystkie klucze są bardzo podobne i powodują wiele kolizji, co skutkuje długimi sekwencyjnymi poszukiwaniami w wiadrze.

liczba domyślna wiadro jest 8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash hash z 1000 chwytaki (z dokładnością do potęgi 2)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

Pomaga to również na zewnątrz, gdy błogosławi się hash Perl OO. Możesz przyspieszyć, jeśli wiesz, że będzie dużo kluczy.

Powiązane problemy