WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:ファイルデータのリストアップの順位

0:[投稿] マイム [MAIL] [2004/02/15 20:07 ][環境:IE6,WIN98 perl,UNIX,Apache,CGI ]

たびたびお世話になっています。今回も、よろしくお願いします。
早速ですが、現在perlにて、ファイルのデータを2つの条件にてリストアップ表示させようとしていますが、どのようにしたものかと、壁に当たっています。
例えば、下記のようなファイルのデーターの場合

a1<>a2<>a3<>a4<>0<>0<>
b1<>b2<>b3<>b4<>1<>1<>
c1<>c2<>c3<>c4<>0<>2<>
d1<>d2<>d3<>d4<>1<>3<>
e1<>e2<>e3<>e4<>1<>4<>
f1<>f2<>f3<>f4<>0<>5<>

リストアップの条件は、上記の右から2つ目の数の「1」であことが条件なのですが、左の文字が「d1」であるものが、一行目に表示するようにさせるためには、どのような方法がよいのか悩んでいます。
if文にて、上記の右から2つ目の数の「1」であり、左の文字が「d1」であれば表示させ、そのときの右端の数字「X」を覚えておき、最終行までなめていき、はじめから「X-1」行まで一行づつチェックしていけばできそうですが、もっとスマートな方法は無いものかと悩んでいます。
ファイルの1行のデーターは長いですが、件数は30件程度です。
よろしく、お願いいたします。


1:[回答] 森田 [2004/02/16 05:59 ]

とりあえずこんなところでしょうか

@list = grep {/<>1<>[^<>]*<>$/} @list;
@list = sort {
 my $d1a = scalar($a =~ /^d1/);
 my $d1b = scalar($b =~ /^d1/);
 $d1b <=> $d1a;
 } @list;


2:[回答] 森田 [2004/02/16 06:08 ]

別に、変数に入れる必要はなかったか...

scalar($b =~ /^d1/) <=> scalar($a =~ /^d1/)

...もしかしたら scalar は冗長かもしれないけれど、
演算子の優先順位調べるのがちょっと面倒なのと、
括弧で括るとリストコンテキストになってしまうので...


3:[回答] マイム [2004/02/16 08:29 ]

森田 さん
悩みが一気にはれる回答を頂きまして、ありがとうございます。

とりあえずと言っては申し訳ないのですが、grep {/<>1<>[^<>]*<>$/} @list; 部分の/<>1<>[^<>]*<>$/を実際のデータに合うものに変更を試みてみます。
結果を報告させていただきます。


4:[回答] AC [2004/02/16 20:13 ]

ソートは実行速度がO(n log n)なので、この場合、配列にデータを取り込んで
抜き出す方が高速です。
(この場合、30件しかないので大差はありませんが、件数が多くなれば差が出ます)

@list = grep {/<>1<>[^<>]*<>$/} @list;
@result = grep {/^d1/} @list;
push @result, grep {!/^d1/} @list;


5:[回答] マイム [2004/02/16 21:39 ]

AC さん
ありがとうございます。
関数の知識がない私に、よい勉強の機会と適切なアドバイスを頂きまして感謝しています。
ご紹介いただきました関数について、自分の知識として得るために少し時間を掛けたいと思います。
しばらくの間、ご報告ができませんが、ご猶予を頂きただけますようお願いいたします。
まずは、お礼まで。


6:[完了] マイム [2004/02/17 08:07 ]

森田さん、AC さん
ありがとうございました。
おかげさまで、目的のリストアップを作成できました。
sort、grep、scalar、push、=~、 /^*/、[^*]*、*$ 等、多くの知識を得ることができました。
今後もよろしくお願いいたします。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World