
cmp
Способов сортировки три - числовой, алфавитный и смешанный.
| | #!/usr/bin/perl6
my $a=10; my $b=7; my $c='cursor'; my $d='dux';
say $a <=> $b; # $a больше $b
say $a leg $b; # но начинается с меньшего символа
say $a cmp $b; # автоматически используется <=>
say $c <=> $d; # индиффирентно
say $c leg $d; # $c "меньше", то есть раньше по алфавиту
say $c cmp $d; # автоматически используется leg | | Order::Decrease
Order::Increase
Order::Decrease
Order::Same
Order::Increase
Order::Increase |
При сортировке sort по умолчанию используется cmp - сравнение. Предположим, у нас проблема. Часть имен записаны с заглавной буквы, часть - нет. Всё равно надо отсортировать имена по алфавиту.| | #!/usr/bin/perl6
my @list=<Вася петя емеля Джон джордж яша октавиан Николя>;
@list.sort».say; | | Джон
Николя
яша
петя
емеля
Вася
октавиан
джордж |
Так нас совсем не устраивает. Предположим, что мы - воспитательница детского сада. Нам позарез необходимо отсортировать подопечных.| | #!/usr/bin/perl6
my @list=<Вася петя емеля Джон джордж яша октавиан Николя>;
my @sorted=sort { uc($^a) leg uc($^b) }, @list;
@sorted».say; | | Николя
петя
джордж
октавиан
Вася
яша
емеля
Джон |
Это - то, что надо. Массив сравнивается попарно, каждая пара заносится в оперативные переменные $^a и $^b, с которыми в фигурных скобках можно вытворять всё, что пожелается душе. Если в нашем примере заменить leg на cmp, то получим тот же результат.| | #!/usr/bin/perl6
my @list=<Вася петя емеля Джон джордж яша октавиан Николя>;
my @sorted=sort { uc($^a) cmp uc($^b) }, @list;
@sorted».say; | | октавиан
Николя
емеля
петя
джордж
яша
Вася
Джон |
Bene. Особенно радует то, что всё хорошо работает и с кириллицей. # mutatio postrema: 8 Sep 2010
|