|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander Pashchenko 2:5062/17.212 17 Nov 2003 01:50:26 To : All Subject : Как упорядочить хэш хэшей по значению ключа --------------------------------------------------------------------------------
Есть два алгоритма.
Один служит для генерации статистики, другой для создания отчёта из неё.
Первый является частью файла filter.pl для тоссера HPT.
Hиже привожу оба:
sub filter
{
# predefined variables:
# $fromname, $fromaddr, $toname,
# $toaddr (for netmail),
# $area (for echomail),
# $subject, $text, $pktfrom, $date, $attr
# $secure (defined if message from secure link)
# return "" or reason for moving to badArea
# set $kill for kill the message (not move to badarea)
# set $change to update $text, $subject, $fromaddr, $toaddr,
# $fromname, $toname, $attr
if($area=~/n5062*/i){
local($echo_user,$val,$echo,$user);
open(STATFILE,"<c:\\fido\\files\\statfile.dat");
while(<STATFILE>){
chomp;
($echo_user,$val)=split(':');
($echo,$user)=split('_',$echo_user);
$params{$echo.'_'.$user}=$val;
}
close(STATFILE);
$params{$area.'_'.$fromname}+=1;
open(STATFILE,">c:\\fido\\files\\statfile.dat");
foreach(sort(keys(%params))){
/(.+)_(.+)/;
print STATFILE $1.'_'.$2.':'.$params{$_}."\n";
}
close(STATFILE);
}
return "";
}
[--А это кончало filter.pl--]
Этот алгоритм создаёт (импровизированную БД) файл вида:
[--Это начало statfile.dat--]
N5062.ANEKDOT_Max Istobinsky:1
N5062.COMMERCE_Anatoliy Ivashenko:2
N5062.COMMERCE_Dmitriy Ivanishev:1
N5062.COMMERCE_Konstantin Klyuev:1
N5062.COMMERCE_Sergey Korostiev:1
N5062.COMM_Maxim Plaxin:1
N5062.LINUX_Maxim Plaxin:1
N5062.NETLIFE_Igor Trifonov:1
N5062.NETLIFE_n5062c:1
[--А это кончало statfile.dat--]
где, сначала указана эха, потом через подчёркивание пользователь и через
двоеточие кол-во писем от него в эту эху.
[--Это начало stat.pl--]
open(STATFILE,"<c:\\fido\\files\\statfile.dat");
print "Статистика эх n5062.* за прошедшую неделю:\n\n";
while(<STATFILE>){
chomp;
($echo_user,$val)=split(':');
($echo,$user)=split('_',$echo_user);
$echoes{$echo}{$user}=$val;
}
foreach $cur_echo (keys %echoes){
print "Эха $cur_echo:\n";
foreach $cur_man (keys %{$echoes{$cur_echo}}){
print ">>$cur_man $echoes{$cur_echo}{$cur_man}\n";
}
print "\n";
}
close(STATFILE);
[--А это кончало stat.pl--]
Этот алгоритм должен генерить статистику используя тот файл.
Его вывод представляет нечто подобное этому:
[--Это начало otchet--]
Статистика эх n5062.* за прошедшую неделю:
Эха N5062.TV:
>>Vitaly Pashchenko 1
>>Alexander Maevskiy 1
Эха N5062.LINUX:
>>Maxim Plaxin 1
Эха N5062.NEWS:
>>Birthday Robot 1
>>Sergey Tkachenko 1
>>Alexander Chelmodeev 1
Эха dummy:
>>dummy 0
Эха N5062.ANEKDOT:
>>Max Istobinsky 1
Эха N5062.COMM:
>>Maxim Plaxin 1
Эха N5062.COMMERCE:
>>Sergey Korostiev 1
>>Konstantin Klyuev 1
>>Dmitriy Ivanishev 1
>>Anatoliy Ivashenko 2
[--А это кончало otchet--]
Проблема вот в чём: *как отсортировать пользователей по кол-ву писем в каждой*
*эхе?*
Думаю, задача сводиться к сортировке значений ключей хэша перед перебором, но
вот как это сделать не дохожу.
print "Эха $cur_echo:\n";
> foreach $cur_man (keys %{$echoes{$cur_echo}}){ #<-----как здесь делать?
print ">>$cur_man $echoes{$cur_echo}{$cur_man}\n";
}
Счастливо _All_ !
... и тишина...
--- 1.1.5-020726
* Origin: Меньше знаешь - крепче спишь! (2:5062/17.212)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/38923fb7f140.html, оценка из 5, голосов 10
|