20

ネストされた配列操作を使用してアルゴリズムを実装すると便利なことがよくあります。たとえば、指定された各文字で始まるリスト内の単語数を見つけるには、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]

式では、2 つのループ反復変数をw.startswith(c)区別するのは簡単です。名前が異なるためです。wc

Perl では、次のようなことをしたいと思います。

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

ただし、これに関する明らかな問題は、最も内側の反復変数 (左側の に適しています$_) のみを参照し、外側の反復変数 ( に適しています) を参照しないことです。Perl でこの問題を回避する慣用的な方法は何ですか? grep$_map/^$_/

4

1 に答える 1

25

ローカル変数に割り当てるだけです:

@a = qw(foo bar baz);
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f)
于 2009-02-12T22:22:18.690 に答える