配列の抜き出しについて
[上に]
[前に]
[次に]
笑う犬
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'にしかマッチしないですね。
私は何を書いているんでしょう ^_^;)
[上に]
[前に]
[次に]