|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/35555f209c8f.html, оценка из 5, голосов 10
|