2012-12-03 6 views
6

Chcę dodać wartości z wartości skrótu, które utworzyłem.Dodawanie wartości w hasz (Perl)

my $value_count; 
foreach my $key (@keys) { 
    $value_count = sum($words{key}, $value_count); 
} 

Jednak gdy uruchamiam to mam

Undefined subroutine &main::sum called at C:/Users/Clayton/workspace/main/Main.pl line 54, <$filehandle1> line 174. 

nie jestem pewien, gdzie wezwę niewłaściwy tutaj. Jestem nowy w Perlu.

EDIT: Próbowałem przy użyciu tylko operator +, ale pojawia się błąd

Use of uninitialized value in addition (+) at C:/Users/Clayton/workspace/main/Main.pl line 54, <$filehandle1> line 174. 

Prawie moja hash jest jak Key Value kot 2 pies 4 rat 1

więc Próbuję zsumować wszystkie wartości, więc mogę wziąć średnią.

EDYCJA 2: Rzeczywista poprawka jest w komentarzach, których potrzebowałem, aby mój $ value_count = 0. To naprawiło wszystko. Dziękuję wam wszystkim. Myślę, że jest to ważna kwestia do rozwiązania i myślę, że może być przydatna dla kogoś innego, więc zamierzam ją opuścić.

+1

Czy naprawić literówka z 'klucz' zamiast' $ klucz'? – Tim

+1

Upewnij się, że używasz znaku "$". Nie jesteś w swoim przykładzie. – jmcneirney

+0

@ Tim N aww darn Mam literówkę ..... –

Odpowiedz

20

Aby użyć funkcji sum, potrzebujesz pakietu List::Util. Ale to nie jest konieczne w tym przypadku, jak można użyć operatora +:

$value_count = $value_count + $words{$key}; 
# or $value_count += $words{$key}; 

W rzeczywistości, można użyć sum i uniknąć pętli. To rozwiązanie należy użyć:

use List::Util 'sum'; 
my $value_count = sum values %words; 

values Funkcja zwraca wartości hash w postaci listy, a sum sumy tej listy. Jeśli nie chcesz, aby podsumować ponad wszystkie klucze, użyj kawałek hash:

use List::Util 'sum'; 
my $value_count = sum @words{@keys}; 
+1

Myślę, że użycie 'wartości' jest prawdopodobnie prostsze niż wycinek mieszania:' perl -MList :: Util = sum -le '% h = (jeden => 1, dziesięć => 10, sześć => 6); print sum (values% h) '' – Ashley

+0

@Ashley Tak, ale to działa tylko wtedy, gdy chcesz zsumować wszystkie wartości. – Tim

+0

Masz na myśli, jak w OP: P – Ashley

3

powinno być w porządku, jeśli wymienić:

$value_count = sum($words{key}, $value_count); 

Z:

$value_count += $words{key};