カレッヂ |
質問者 エス
投稿日 2004/7/15(木) 18:41:28
非常にヒントに近い質問がここにありましたが、ちょっとだけやりたいことが違いました。 ここを例に説明します。よろしくお願いします。 http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020314010255.shtml それで、私がしたい事は、 上で使っていた hairetu.dat を ########## hairetu.dat ########## 200,3 300,4 100,7 などとし、配列[0]と[1]を掛け合わせた値でソートするにはどうしたら 良いのでしょうか? ------------ 300,4,1200 100,7,700 200,3,600 ------------ ↑こんな風に出力したい。 よろしくお願いします。
プロバイダ参照: |
回答者 dental
[削除]
投稿日 2004/7/16(金) 00:03:58
#!/perl @array = ( [ 200, 3 ], [ 300, 4 ], [ 100, 7], [ 400, 8], [ 1200, 5] ); @sort_array = sort { $b->[2] <=> $a->[2] } map { push (@{ $_ }, $_->[0] * $_->[1] ); $_; } @array; ### 確認 ### foreach (@sort_array) { print join(',', @{ $_ }); print "\n"; } __END__ 他にも書き方はあると思いますが とりあえず書いてみました。 効率的かどうかは考慮してません。 @array にデータを読み込んだものとします。 $a<=>$b で逆順です。 |
質問者 エス
[削除]
投稿日 2004/7/17(土) 15:28:45
> dentalさん どうもありがとうございます。 まだまだ勉強不足で、「あ〜なるほど…」とはいきませんが、 これをヒントに、試してみたいと思います。 |
回答者 dental
[削除]
投稿日 2004/7/17(土) 23:02:27
2次配列を使わない場合、下記のような書き方もできます。 こちらのほうがわかりやすいでしょうか。 sort 関数が把握できれば他は問題ないと思います。 data.dat --------- 300,3 1200,2 650,2 --------- my @array = (); open(F, "< data.dat") or die $!; while (my $temp = <F>) { chomp $temp; my ($one, $two) = split(/,/, $temp); push @array, "$temp," . ($one * $two); # 乗算値をカンマをつけて追加 } close F; # この時点での @array の値 #----------- # 300,3,900 # 1200,2,2400 # 650,2,1300 @array = sort { # 乗算値でソート ( split(/,/, $b) )[2] <=> ( split(/,/, $a) )[2]; } @array; print join("\n", @array); |
質問者 エス
[削除]
投稿日 2004/7/20(火) 21:49:07
> dental さん これはボクにとっては分かりやすかったです。 こっちの方をヒントにCGIを作成してみて、 なんとか、目的を達成しています。 まだ、改良したいところはあるのですが。 基本というか、形が分かりました。 ありがとうございます。 |
返信(回答)する
Web裏技 |