2009-02-12 17 views
19

A menudo es útil implementar algoritmos usando operaciones de matriz anidadas. Por ejemplo, para encontrar el número de palabras en una lista que comienza con cada personaje determinado, es posible hacer algo como esto en Python:

>>> a = ["foo","bar","baz"] 
>>> map(lambda c: len(filter(lambda w: w.startswith(c), a)), ('a','b','c','d','e','f')) 
[0, 2, 0, 0, 0, 1] 

En la expresión w.startswith(c) es trivial para distinguir entre las dos variables de iteración de bucle w y c porque tienen diferentes nombres.

En Perl, me gustaría hacer algo como esto:

@a = ("foo", "bar", "baz"); 
map length(grep $_ =~ /^$_/, @a), ('a','b','c','d','e','f') 

Sin embargo, el problema obvio de esto es que $_ se refiere sólo a la variables grep iteración más interna (adecuado para el $_ en el izquierda), no el de la exterior map (adecuado para el /^$_/). ¿Cuál es la forma idiomática de evitar este problema en Perl?

Respuesta

21

Basta con asignar a la variable local:

@a = qw(foo bar baz); 
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f) 
+0

excelente, que lo hace. ¡Gracias también por el recordatorio de utilizar escalar en lugar de longitud! –

+0

increíble fantástico fantástico – run

Cuestiones relacionadas