Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Paul Kulchenko                       2:5020/400     04 Aug 2000  22:13:01
 To : All
 Subject : Re: advenced sort
 -------------------------------------------------------------------------------- 
 
 Hi, Leonid!
 
 Leonid Subbotin wrote:
 
 > есть например адреса поинтов|нодов
 > @mas=('2:5007/16.1','2:5007/1','2:5000/123.12','1:345/12');
 > вот мой способ, но надеюсь бывает более интересный/красивый/быстрый ?!
 > 
 > @addr=sort {retr($a) <=> retr($b) || retz($a) <=> retz($b) || int(retnp($a))
 > <=> int(retnp($b)) || length(retnp($a)) <=> length(retnp($b)) || retnp($a) <=>
 > retnp($b)} @mas; # это все одна строка 8-( )
 > 
 > sub retr {
 > my $line=shift;
 > $line=~s/^(\d+)/$1/;
 > return($line);
 > }
 
 Кроме того, что он неправильный (поскольку ты МОДИФИЦИРУЕШЬ строку,
 которую хочешь отсортировать, чего делать никак нельзя) он еще и не
 быстрый (поскольку ты делаешь это для КАЖДОГО сравнения) и не красивый
 (поскольку длинный и неочевидный). Более правильный способ будет похож
 на:
 
 map  { $_->[0] }
 sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] 
     || $a->[3] <=> $b->[3] || $a->[4] <=> $b->[4] }
 map  {[$_, split m![:/.]!]} @mas
 
 И никаких дополнительных функций. Будет работать и такой вариант:
 
 map  { $_->[0] } sort { $a->[1] cmp $b->[1] }
 map  {[$_, sprintf "%04d"x4, split m![:/.]!]} @mas
 
 Best wishes, Paul.
 --- ifmail v.2.15dev5
  * Origin: Rostelecom/Internet Centre (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: advenced sort   Paul Kulchenko   04 Aug 2000 22:13:01 
Архивное /ru.perl/35555f209c8f.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional