2009-02-12 6 views
19

Es ist oft nützlich, Algorithmen mit verschachtelten Array-Operationen zu implementieren. Um zum Beispiel die Anzahl der Worte in einer Liste zu finden, die mit jedem gegebenen Zeichen beginnen, könnten Sie so etwas wie dies in Python tun:

>>> 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] 

Im Ausdruck w.startswith(c) es ist trivial zwischen den beide Schleifeniterationslatenzzeit Variablen zu unterscheiden w und c weil sie unterschiedliche Namen haben.

In Perl, würde Ich mag so etwas tun:

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

jedoch das offensichtliche Problem dabei ist, dass $_ nur auf die auf der innerstegrep Iterationsvariable (geeignet für die $_ bezieht sich links), nicht die für die äußere map (passend für die /^$_/). Was ist der idiomatische Weg, um dieses Problem in Perl zu vermeiden?

Antwort

21

zuweisen Nur um lokalen Variable:

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

ausgezeichnet, dass es funktioniert. Danke auch für die Erinnerung, Skalar statt Länge zu verwenden! –

+0

genial super fantastisch – run

Verwandte Themen