2012-12-03 5 views
6

Desidero sommare i valori da un hash che ho creato.Aggiunta dei valori in un hash (Perl)

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

Tuttavia quando ho eseguito questo ottengo

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

Io non sono davvero sicuro di dove sto andando male qui. Sono nuovo di Perl.

EDIT: Ho provato ad utilizzare solo operatore +, ma ho l'errore

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

Praticamente il mio hash è come Chiave Valore cat 2 cane 4 ratto 1

Così ho Sto cercando di sommare tutti i valori, quindi posso prendere una media.

MODIFICA 2: La correzione effettiva è nei commenti che dovevo rendere il mio $ value_count = 0. Che ha risolto tutto. Grazie a tutti. Penso che questo sia un problema importante da risolvere e penso che potrebbe essere utile per qualcun altro, quindi ho intenzione di lasciarlo.

+1

hai fatto a risolvere l'errore di battitura con 'key' invece di' $ key'? – Tim

+1

Assicurati di utilizzare il sigal '$'. Non sei nel tuo esempio. – jmcneirney

+0

@Tim N aww maledetto ho un errore di battitura ..... –

risposta

20

Per utilizzare la funzione sum, è necessario il pacchetto List::Util. Ma questo non è necessario in questo caso, come è possibile utilizzare l'operatore di +:

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

In realtà, si potrebbe utilizzare sum ed evitare il ciclo. Questa è la soluzione si dovrebbe usare:

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

La funzione values restituisce i valori di un hash come una lista, e sum somme tale elenco. Se non si desidera sommare su tutti i tasti, utilizzare una fetta hash:

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

Penso che l'utilizzo di 'values' sia probabilmente più semplice di una hash slice:' perl -MList :: Util = sum -le '% h = (one => 1, ten => 10, six => 6); print sum (values% h) '' – Ashley

+0

@Ashley Sì, ma funziona solo se si desidera sommare tutti i valori. – Tim

+0

Come nell'OP: P – Ashley

3

si dovrebbe andare bene se si sostituisce:

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

Con:

$value_count += $words{key};