WEB相談室

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

タイトル:Perlのソート

0:[投稿] manet [URL] [2004/03/17 21:56 ][環境:WinXP ActivePerl]

いつもお世話になってます。

HPでアクセス解析を設置してます。
訪問回数ランキングをしたいと思って、クッキーを使って訪問回数を取得しました。
次の$CNTに訪問回数を格納してます。

$cnt = 0;
foreach $line(@log){
    ($num, $date, $NAME, $FROM, $host, $addr, $OS, $ref, $CNT) = split(/\t/, $line);
    $before[$cnt] = $CNT;
    $atName[$cnt] = $msg;        #$msgは$NAMEと$FROMを連結して名前にしたもの
    print $i.": $CNT = $msg<BR>\n";
    $cnt++;
}

「@after = sort{$b <=> $a}@before;」
を使うみたいですが、

訪問回数の後に、その人の名前を表示させたいのですが
どうすればそのソートした訪問回数の人の名前を取得することができるのでしょうか?


1:[回答] kak [2004/03/18 14:29 ]

ども。

ちょっとしたサンプルを作ってみました。
お試しあれ。

#!/usr/local/bin/perl

$log[0] = "aa   bb      suzuki       tarou     cc      dd      ee      ff      1";
$log[1] = "aa   bb      satou takuma       cc      dd      ee      ff      9";
$log[2] = "aa   bb      saitou    jirou   cc      dd      ee      ff      5";

$cnt = 0;
foreach $line(@log){
   ($num, $date, $NAME, $FROM, $host, $addr, $OS, $ref, $CNT) = split(/\t/, $line);
   $before[$cnt]->[0] = $CNT;
   $before[$cnt]->[1] = $NAME.$FROM;
   $cnt++;
}

@result = sort {$b->[0] <=> $a->[0]} @before;

for($i=0;$i<=$#result;$i++){
   print "$result[$i]->[0]\n";
   print "$result[$i]->[1]\n";
}


exit;


2:[回答] gun [2004/03/18 14:34 ]

配列の下に連想配列を作ってしまえば、訪問回数でソートしても
各属性を取り出せます。
分かり難いのはソート関数の辺りだけかと思います。
また、読み取り難かったので変数名なども少し変えました。

print "before<BR>\n";
for ($i=0; $i<=$#log; $i++) {
   ($num, $date, $NAME, $FROM, $host, $addr, $OS, $ref, $CNT) = split(/\t/, $log[$i]);
   $before[$i]{'CNT'} = $CNT;
   $msg = "$NAME:$FROM";
   $before[$i]{'msg'} = $msg;
   print "$CNT = $msg<BR>\n";
}

@after = sort{$$b{'CNT'} <=> $$a{'CNT'}}@before;

print "after<BR>\n";
for ($i=0; $i<=$#after; $i++) {
    print "$after[$i]{'CNT'} = $after[$i]{'msg'}<BR>\n";
}


3:[完了] manet [URL] [2004/03/18 21:36 ]

できました!Perlにもアロー演算子ってあるんですね。
連想配列のやり方もすごく参考になりました!

kakさん、gunさんど〜も有難うございました☆

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World