目からウロコな配列の使い方(grep)
例えば
my @array = (1, 3, 5, 7, 9);
のような配列があって、値が5の要素番号(何番目か)を得たい場合を考えて
my @r;
for (my $i=0; $i<$#array+1; $i++) {
printf "i=(%d)[%s]\n", $i, $array[$i];
push(@r, $i) if ( $array[$i] eq '5' );
}
print join("\n", @r);
って感じのコードを書いてみるが、
i=(0)[a]
i=(1)[b]
i=(2)[c]
i=(3)[d]
i=(4)[c]
i=(5)[f]
i=(6)[g]
5
となって、なんかスマート感がなく気持ちが悪いので、ネットで調べてみると、モンクさんが素晴らしいコードを教えてくれたのでメモ。
my @r = grep { $array[$_] eq '5' } 0 .. $#array;
print join("\n", @r);
grepは
grep { 条件 } リスト
だけど、リストに配列のポインタ値をもって来るところが考えつかなかった。
リストはポインタ値が_に入るので
$array[0] eq '5'
$array[1] eq '5'
$array[2] eq '5'
$array[3] eq '5'
$array[4] eq '5'
$array[5] eq '5'
:
のような感じでポインタの値がかわるようになる仕組み。
いろいろ考えられるけどすごいね。素晴らしい。