2010-06-15 30 views
7

Digamos en Perl Tengo una lista de referencias hash, y cada uno debe contener un campo determinado, digamos foo. Quiero crear una lista que contenga todas las asignaciones de foo. Si hay un hash que no contiene foo, el proceso debería fallar.Perl, obtenga todos los valores hash

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

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

#list should be (1,2); 

¿Hay una manera más concisa de hacer esto en Perl?

+1

Solo quería aclarar que no está creando una lista de asignaciones, está creando una lista que consta de cada hashes 'foo' value, y su ejemplo de código no tiene nada que ver con 'process failing', por lo que No solo estoy pidiendo más conciso. –

+1

En general: siempre que te encuentres haciendo 'foreach ... {... push ..}' puedes hacer el código más corto y más simple usando map o grep. – Ether

Respuesta

6

Sí. Ahi esta.

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

para expresiones complejas de mapas como esta, por lo general es más fácil de leer usando la sintaxis de bloque en lugar de la expresión simple –

+0

que es mejor +1, utilizo la sintaxis desnuda todo el tiempo para expresiones cortas, probablemente la única larga que no lo hace obtener un bloque es el caso de un mapa que devuelve un arrayref: 'map [...] => ...' –

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

respuesta de Evan está cerca, pero volverá los hashrefs más que el valor de foo.

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

Sí, he solucionado esto. y, también lo hice morir, hay una desconexión entre su código y su pregunta. También puedes hacer esto con un ciclo. –

2

Puede utilizar la función de mapa para esto:

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

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

mapa aplica la función en el primer argumento sobre todos los elementos del segundo argumento.

grep también es genial para filtrar elementos en una lista y funciona de la misma manera.

Cuestiones relacionadas