2010-06-15 12 views
7

Załóżmy, że w Perlu mam listę odwołań hashowych, a każda z nich musi zawierać określone pole, na przykład foo. Chcę utworzyć listę zawierającą wszystkie mapowania z foo. Jeśli istnieje hasz, który nie zawiera foo, proces powinien zakończyć się niepowodzeniem.Perl, uzyskaj wszystkie wartości mieszania

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

my @list =(); 
foreach my $item (@hash_list) { 
    push(@list,$item->{foo}); 
} 

#list should be (1,2); 

Czy istnieje bardziej zwięzły sposób robienia tego w Perlu?

+1

Chciałem tylko wyjaśnić, że nie tworzysz listy odwzorowań, tworzysz listę, która składa się z każdej wartości '' foo' ", a twój przykładowy kod nie ma nic wspólnego z" procesem kończącym się niepowodzeniem ", więc nie tylko proszą o bardziej zwięzłe. –

+1

Ogólnie: za każdym razem, gdy robisz "foreach ... {... push ..}" możesz uczynić kod krótszym i prostszym przy użyciu map lub grep. – Ether

Odpowiedz

6

Tak. jest.

my @list = map { 
    exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo' 
    } 
    @hash_list 
; 
+0

dla złożonych wyrażeń mapowych takich jak ten, zwykle łatwiej jest czytać używając składni blokowej, a nie gołego wyrażenia –

+0

, co jest lepsze +1, używam nieprzerwanej składni cały czas dla krótkich wyrażeń, prawdopodobnie jedynej długiej, która nie dostać blok to przypadek mapy, która zwraca tablicęref: 'map [...] => ...' –

0
if (@hash_list != grep { exists $_->{foo} } @hash_list) { 
    # test failed 
} 
1

odpowiedź Evana jest blisko, ale zwróci hashrefs zamiast wartości foo.

my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list 
+0

Tak, naprawiłem to. i, sprawiłem też, że umarł, jest rozłączenie między jego kodem a jego pytaniem. Możesz to zrobić za pomocą jednej pętli. –

2

można użyć funkcji map dla tego:

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

@list = map($_->{foo}, @hash_list); 

mapa dotyczy funkcji w pierwszym argumencie nad wszystkimi elementami drugiego argumentu.

grep jest również fajny filtrować elementy na liście i działa w ten sam sposób.

Powiązane problemy