2011-06-29 12 views
5

Estoy usando el mapa para extraer el primer elemento de una matriz 2D. Aquí está el pequeño fragmento de código.entendiendo este comportamiento de mapa

my $array = [ [1,11,111], [2,22], undef, [4] ]; 

my @firstList = map { (defined $_) && $_->[0] } @$array; 

Así que aquí estoy esperando el mapa para devolver una matriz que tiene elementos con valor de alguno de los elementos o undef primer elemento de $ de matriz.

pero la salida no es la misma que estoy esperando. Para undef, obtengo un elemento de tipo 'escalar'.

Si cambio la instrucción del mapa con el siguiente bloque, entonces estoy obteniendo el resultado esperado.

my @firstList = map { $_->[0] } @$array; 

Por favor, ayúdame a entender acerca de estas dos afirmaciones mapa.

Respuesta

4

Ambos devuelven el resultado de la última operación realizada.

Para la primera, cuando evalúa (defined $_) && $_->[0] para undef, ve que defined $_ es falso y detiene el procesamiento de la expresión booleana. $_->[0] no se evalúa en absoluto en este caso. defined $_ fue la última operación evaluada, y su resultado fue false, que supongo que se representa con un 0.

Por el segundo, es el valor real del hijo de @$array que es donde obtiene el valor undef.

+0

Una pequeña corrección: 'undef' definido devuelve' '' '. – Dallaylaen

+2

Me preguntaba por qué undef -> [0] funciona (incluso bajo 'strict'). Resulta que está [autovivificado] (http://en.wikipedia.org/wiki/Autovivification), es decir, establecido implícitamente en '[]' ** en la matriz original **. – Dallaylaen

+1

@Dallaylaen: esto hace que suficientes personas conozcan que CPAN tiene un módulo de "autovigilancia" en http://search.cpan.org/perldoc?autovivification que le permite desactivarlo con el comando 'no autovivification;' –

0
map { (defined $_) && $_->[0] } 

en realidad itera a través de todos y cada uno de los elementos de la matriz y aplica alguna función o expresión. en caso de que fuera la siguiente función: defined($_) && $_->[0] si su celda es undef, la tercera celda de su matriz evalúa defined(undef) && $->[0] (que equivale a '' puede intentarlo ...), mientras que la otra evalúa a 1 && $->[0] que equivale a $ -> [0 ]

Por cierto, esa es también la razón por la que funciona su segunda declaración, para cada celda de su matriz, elige la primera celda interna.

Cuestiones relacionadas