ラウンジをタイトルでアルファベット順に表示したい

[上に] [前に] [次に]
へっぽこ 1999/11/25(木) 11:42:48
パールは初心者で、作った事はありません。
触っても色を変更する程度です。よろしくお願いします。

ここのラウンジで、タイトル順に表示したいのです。

    @dirs = sort(@dirs);
    @files = sort { $b <=> $a } @files;
    splice(@files, $num);

    # 最近更新されたトピック一覧
    print "<P>\n";
    &printTopicList(@files);

このへんを変更すればいいのかとは思うのですが、
どう変更すればよいのかわかりません。

noriko 2000/03/12(日) 11:24:39
わたしもへっぽこさんと同じ質問です。
ログファイルの更新日順にソートされていることを知ったのですが、
とにかくパール初心者につき、難しそうで。。。
どなたかタイトル順に表示する方法アドバイスしてください。
お願いします。

さだひろ [E-Mail] 2000/03/12(日) 14:24:01
とほほラウンジのデータ構造はごぞんじですか?(私も調べてわかったのだが ^^;
[wwwlng]フォルダの下に[200003]などのフォルダ(年月を表す)があり,
その下には 00030125.txtなどのファイル(00年03月0125番目)があります.
それで@files には,
$files[0] = "952834124 200003/00030001.txt"
$files[0] = "952834094 200003/00030003.txt"
$files[0] = "952834064 200003/00030002.txt"
のようなデータが格納されています.
# 952834064は最終変更時のUNIX時間
#(1970-01-01 00:00:00 UTCから起算した秒数)

つまり,@files = sort { $b <=> $a } @files; で
更新日(正確には秒)順に,splice(@files, $num); で
表示するスレッドの数を制限しています.
ですからここまでは変えないでいいでしょう.

そこで sub printTopicList #(@files) の中をいじります.
その中の
 foreach $file(@files){
   ...............
      print "<TABLE BORDER=1>\n";
    }
 }

のループ(54行ある)で,実際のHTML表示を出力しています.

ですからその前でsubjectを基準にソートするため,
上に示したループの前に次のコードを加えてみてください.

#@filesのファイルからsubjectを集めてソートする.
    local %subjects;
    foreach $file (@files) {
        local $fn = (split(/ /, $file))[1];
        open(IN, $fn) || next;
        $subject = <IN>;
        $subject =~ s/^Subject: //;
        $subject =~ s/[\r\n]+$//;
        $subjects{$file} = $subject;
        close(IN);
    }
    @files = sort {$subjects{$a} cmp $subjects{$b}} @files;

タイトルは文字列の順,すなわちASCII順になります.
これでよければいいのですが.

日本文字があった場合,あいうえお順とするには>????
sortのところで何か考えて見てください.

さだひろ 2000/03/12(日) 14:25:57
まちがいにすぐ気付くと思いますが,念のため
>@files には.
$files[0] = "952834124 200003/00030001.txt"
$files[1] = "952834094 200003/00030003.txt"
$files[2] = "952834064 200003/00030002.txt"

さだひろ 2000/03/12(日) 14:44:05
># 952834064は最終変更時のUNIX時間
>#(1970-01-01 00:00:00 UTCから起算した秒数)

>つまり,@files = sort { $b <=> $a } @files; で更新日(正確には秒)順に
つまり「とほほラウンジ」には10億秒問題があるのでしょうか?
#あと1年半くらい....

さだひろ 2000/03/12(日) 15:00:15
>10億秒問題
@files = sort { $b <=> $a } @files; は数値比較で,
非数字文字である空白までの値が自動的に取り出されて比較されるから,
問題ないのかも.(そうだったら,とほほさん,済みません)

さだひろ 2000/03/12(日) 15:18:00
タイトルが英数字のみで,もともと大文字小文字が混じっているが,
ソートではその区別をなくしたければ,

  @files = sort {lc $subjects{$a} cmp lc $subjects{$b}} @files;

で全部小文字にしてしまう(lcの代わりにucで大文字にしても可)とか.
#こういうのがいっぺんに言えたらいいね>オレ

noriko 2000/03/13(月) 00:33:49
[[解決]]
さだひろさん、アドバイスありがとうございます。
さっそく編集してみた結果、パーフェクトです!
素晴らしいです! たいへん感謝しています。

>とほほラウンジのデータ構造はごぞんじですか?

最近になって知りました。
それまでは、なんか別のラインで悩んでいました。

>つまり,@files = sort { $b <=> $a } @files; で
>更新日(正確には秒)順に,splice(@files, $num); で
>表示するスレッドの数を制限しています

パール初心者のわたしにとって、
この部分は参考書片手に勉強になりました。
(ちょっとだけパールについてふっきれた感じかなァ...)

>#こういうのがいっぺんに言えたらいいね>オレ

逆にわたしにはとても分かりやすかったです。
ほんとうにありがとうです。

最初のへっぽこさんの質問から日にち経っているので、
わたしが解決チェックしちゃいます。

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