Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Как сделать сортировку по времени????


Автор: treee 12.1.2011, 09:05
Лог вида:

2011     Jan     11      16:29:56      user  google.ru  10 10.10.10.10
2011     Jan     11      08:45:47      user  ya.ru  10 10.10.10.10    
2011     Jan     11      09:02:53      user  help.ru  20 10.10.10.10
2011     Jan     11      15:23:40      user  ya.ru  10 10.10.10.10
2011     Jan     11      12:11:57      user  ya.ru  10 10.10.10.10


Делаю:

Код


Open FF,"<$days/1111" || MyDie("can't open $days/1111");

  while (<FF>) {

  ($years,$month,$day,$time,$userrr,$site,$size,$ip)=split;


if ( $userrr eq $user )

{

  $tmp=$hTPL{site};
  $tmp=~s/##TIME##/$time/;
  $tmp=~s/##SITE##/$site/;
  $tmp=~s/##USER##/$userrr/;
  $tmp=~s/##SIZE##/$size/g;
  $tpl{site} .= $tmp;
}





У меня передаётся:
 
16:29:56      user  google.ru  10
08:45:47      user  ya.ru  10    
09:02:53      user  help.ru  20
15:23:40      user  ya.ru  10
12:11:57      user  ya.ru  10

Как сделать сортировку по времени ($time), чтобы передавалось:
08:45:47      user  ya.ru  10   
09:02:53      user  help.ru  20 
12:11:57      user  ya.ru  10
15:23:40      user  ya.ru  10
16:29:56      user  google.ru  10

, что то у меня не получается, пробывал вставлять:

@Sorted = sort { $a cmp $b } @time;

print "@Sorted";


Что то не получилось, подскажите в какую сторону копать?

Автор: Jimy 12.1.2011, 10:00
Цитата(treee @ 12.1.2011,  09:05)
, что то у меня не получается, пробывал вставлять:
@Sorted = sort { $a cmp $b } @time;
print "@Sorted";

Куда вставляли? Покажите окончательный вариант кода, который не работает. В приведенном коде нет никакой сортировки.

Автор: treee 12.1.2011, 10:13
Сюда:


if ( $userrr eq $user )

{
@time = $time;

@Sorted = sort { $a cmp $b } @time;

print "@Sorted";

Автор: Jimy 12.1.2011, 10:20
 smile 

Код

my @time;
while (<FF>) {
...
if ( $userrr eq $user ) {
push @time, $time;
...
}
}
@Sorted = sort { $a cmp $b } @time;
print "@Sorted";


а в вашем коде @time перезаписывается на каждой итерации внутри while

Автор: alezzz 12.1.2011, 10:20
Переведите в общее количество секунд и отсортируйте. Пример на http://docstore.mik.ua/orelly/perl/cookbook/ch03_03.htm. Только разделите время на часы, минуты, секунды. Функция timelocal понимает месяц в виде строки 'jan', 'feb' и т.д. и год в формате 2011.

Автор: vadiml 12.1.2011, 10:56
Используйте для сортировки хеш, т.е. сохраните данные вместо массива в хеш где ключём будет время, а потом 
print %time{$_} foreach sort keys %time

Автор: treee 12.1.2011, 12:10
Jimy, 
alezzz, 
vadiml, 

Спасибо.



Jimy, 
Как Вы написали работает не до конца, время он переносит а остальные данные такие как $userrr, $site, size - нет. 

Автор: treee 18.1.2011, 09:41
Благодарю всех за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)