配列の抜き出しについて

[上に] [前に] [次に]
笑う犬 1999/03/29(月) 15:56:07
おそらくレベルの低い質問だと思いますが、
よろしくお願いいたします。

配列の中からパターンマッチングしたものを抜き出すのに
"grep"というのがありますよね。例えば・・・・、

@aaa = (300, 100, 200, 500);
@bbb = @aaa;
foreach $tmp(@bbb){
  print "$tmp\n";
}

とすると、"300"だけが表示されるはずです。
これを"200から300まで"表示したい場合はどうすればよろしいでしょうか?

foreachの中で"if(200〜300までの間だったら){"とやる手段もあるのでしょうが、
実際の配列は、非常に要素数が多いので、
"grep"で抜き出してから処理をしたほうが良いのかな・・・・、と思っています。

もし「どんなに要素数が多くても、foreachで回して大丈夫だ」
というのでしたら、"if 〜"でいってもいいんですが・・・・。
よろしくお願いします。

笑う犬 1999/03/29(月) 15:57:14
上のソース、間違ってしまいました。失礼しました。
正しくは・・・・、

@aaa = (300, 100, 200, 500);
@bbb = grep(/300/, @aaa);

foreach $tmp(@bbb){
print "$tmp\n";
}

こうです。
よろしくお願いします。

ふじ 1999/03/29(月) 16:23:30
@bbb = grep(($_ >= 200 && $_ <= 300) , @aaa);

ですかね。grepの第一引き数は別にパターンでなくても式なら良いので。
#foreachどどう違うかというと・・・同じような気が(^^;;

いいづか 1999/03/30(火) 00:50:44
このケースならきっと
@bbb = grep(/^[23]00$/, @aaa);
がいいと思います。
foreachとの違いですが、いちばん手っ取り早いのは
実際に性能を計測することかもしれませんね。言語仕様
的な制限はないはずです。

ふじ [HomePage] 1999/03/30(火) 03:31:26
>このケースならきっと
>@bbb = grep(/^[23]00$/, @aaa);
これだと '200' と '300' しかマッチしませんよ?

>これを"200から300まで"表示したい場合はどうすればよろしいでしょうか?
↑200以上300以下ってことですよね。ならば、
($_ >= 200 && $_ <= 300)
でしょう。

しかし、grepで一度配列全体を検索してマッチの判定をするのであれば、
foreach $tmp (@aaa){
    print "$tmp\n" if($tmp <= 300 && $tmp >=200);
}
でも、大して違わないような気もしますし・・・

print join("\n", grep($_>=200 && $_<=300,@aaa));
これが一番短いかも(^^;

B-Cus 1999/03/30(火) 03:48:15
> これだと '200' と '300' しかマッチしませんよ?

/^(2\d\d|300)$/ かな。200〜500なら /^([2-4]\d\d|500)$/

まず数字順にソートして、先頭の方から200以上の値を探して、
その要素数を記録、次に最後の方から300以下の値を見付けて、
その要素数を記録、2つの要素数の間を切り出す、ってのはどう?

検索時は線形探索などを使わず、もっと賢いサーチ方法を取る、と。
もしかしたらgrepより速いかも。

そこまでするならCで書けって? ごもっとも(笑)

いいづか 1999/03/31(水) 00:22:35
> @bbb = grep(/^[23]00$/, @aaa);
たしかにこれって '200'と'300'にしかマッチしないですね。
私は何を書いているんでしょう ^_^;)

[上に] [前に] [次に]