2017-11-02 1 views
1
my %number_words = hash_a_file($_); 
foreach my $key (keys %number_words) { 
    ++$word_list{$key}; 
} 

Dies funktioniert, aber ich möchte Mag ichPerl als Argument einer foreach Unterroutine

foreach my $key (keys hash_a_file($_)) { 
    ++$word_list{$key}; 
} 

mit der Zwischengröße vermeiden versucht Refs zu verwenden, aber noch immer nicht. Irgendeine Möglichkeit, dies zu tun? Vielen Dank !

+1

mit was scheitert es? –

+0

Es schlägt fehl, weil Schlüssel eindeutig sind. '% word_list' zählt nur 1 für jeden Schlüssel. – shawnhcorey

Antwort

4

Die Sache ist, wird ein Unterprogramm einen Hash nicht zurück. Es gibt eine Liste zurück. In Ihrem ursprünglichen Code wird es nur zu einem Hash, wenn Sie es in einer Hash-Variablen speichern.

Es gibt jedoch andere Möglichkeiten, einen Hash aus einer Liste zu erstellen. Sie können einen anonymen Hash erstellen und dann die Referenz aufheben. Es ist hässlich, aber es funktioniert.

# Inner braces create an anonymous hash. 
# Outer braces de-reference that into a "real" hash 
foreach my $key (keys %{ { hash_a_file($_) } }) { 
    ++$word_list{$key}; 
} 

Update: So sichern Sie Borodins Kommentar zurück, soll ich hinzufügen, dass, wenn dieser Code zu mir in einem Code-Review vorgestellt wurde, würde ich es empfehlen, Umschreiben ein explizites Hash-Variable zu verwenden, wie Ihr ursprünglicher Code tut .

+0

Danke, funktioniert gut. – chd

+2

Dies beantwortet die Frage wahrscheinlich auf die bestmögliche Weise, aber ich denke, der ursprüngliche Code des OP ist viel klarer und nicht verschwenderischer. Ich würde vermuten, dass 'hash_a_file' einen Hash erstellt und dann' return% hash' zurückgibt, was ihn in eine Liste umwandelt. Es ist ineffizient, dies zu tun und es dann wieder in einen anderen Hash umzuwandeln, und es wäre viel besser, '% hash' zurück zu geben als in ** zdim's Antwort, was diese doppelte Umwandlung vermeidet. – Borodin

+0

Eine bessere Lösung (wenn die Änderung von 'hash_a_file' nicht möglich ist), als unnötig einen Hash zu erstellen, ist die Verwendung von' pairkeys' aus List :: Util. – ikegami

1

eine hashref Rückkehr, so dass Sie ein gültiges Argument für keys (statt einer Liste) bilden können

sub hash_a_file { return { a => 1, b => 2 } } 

foreach my $key (keys %{ hash_a_file() }) { 
    say $key 
} 
+0

Danke aber kann hash_a_file nicht ändern. Dave Cross Lösung funktioniert trotzdem gut. – chd

Verwandte Themen