フォームから入力されたデータをCGIで並び替えるには?

[上に] [前に] [次に]
hiboo [E-Mail] [HomePage] 2000/03/21(火) 02:00:53
自分のHPにCGIを用いてアドレス帳を設けたいのですが、フォームから入力された
「name,Email,age」の情報をage(年齢)順に並び替えたいのですが、どうにも上手く
いきません。
因みに過去(98/08/28)「フォームから入力されたデータの比較をCGIで行うには? 」
というタイトルで同様の問い合わせがあったようですが、私の場合と微妙に違うようの
で改めて質問させていただきました。
また、参考までに「http://www.nettaxi.com/citizens/hiboo/cgi/Qvisit.html」へ
具体的なスクリプトを記載してありますので、合わせてご参照下さい。

Aurai [E-Mail] 2000/03/21(火) 06:10:52
@r=<IN>;
foreach(sort{($a=~/([0-9]*)$/)[0] <=> ($b=~/([0-9]*)$/)[0];}@r){print "$_<br>";}

でどうでしょう
年齢は半角数字であると前提します

もと。 2000/03/21(火) 12:50:14
@listに入っているとして、
print map {"$_->[0]<BR>"}
sort {$a->[3] <=> $b->[3]}
map {[$_,split(/,/)]} @list;
と言うのも有名です。
Schwartzian Transformという名前が付いているそうです。
こちらの方が多少速いかな・・?

hiboo 2000/03/23(木) 00:01:31
Auraiさん、もとさん、ありがとうございました。
ただ、もとさんのスクリプトはなぜか並び替えがうまくいきません。
どうしてでしょうか?
お察しのことと思いますが、私はCGIをはじめたばかりの超素人です。
あつかましいお願いですが、並び替えの対象を代えたりしてアレンジ
するときのために教えて頂いたスクリプトにつきまして解説して頂けな
いでしょうか。

Aurai [E-Mail] 2000/03/23(木) 05:48:18
>foreach(sort{($a=~/([0-9]*)$/)[0] <=> ($b=~/([0-9]*)$/)[0];}@r){print "$_<br>";}

($val =~ /([0-9]*)$/)[0]
で、$valの尻にある数字を抜き出しています

sortで@rの尻の数字で整列したリストを作り
それをforeachで一列ずつprintしています

もと。 2000/03/23(木) 06:23:53
>ただ、もとさんのスクリプトはなぜか並び替えがうまくいきません。
>どうしてでしょうか?
perlのバージョンはいくらですか?
少なくとも手元のperl(5.004_02)では
うまくソートできているようです。

説明は苦手なので、
http://www.din.or.jp/~ohzaki/perl.htm#SortST
を参考にしてください。

hiboo 2000/03/23(木) 08:43:51
Aurai さん、もとさん、早速アドバイスして頂きありがとうございます。

>($val =~ /([0-9]*)$/)[0]
>で、$valの尻にある数字を抜き出しています
尻にある数字とは、dataファイルに「name,Email,age」の順で納められている情報
だとすると、ageの内容でしょうか?
また、順番が「name,age,Email」になってたり、並び替えの対象を別にしたいときは
どうしたらよいでしょうか?

hiboo 2000/03/25(土) 01:31:50
[[解決]]
http://www.din.or.jp/~ohzaki/perl.htm#SortST
をよく読んだら理解できたような気がしますので解決とさせて頂きます。
ありがとうございました。

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