perl6.suОсвоим perl6 к 2015 году!

nota LX. Способы сортировки


       Способов сортировки три - числовой, алфавитный и смешанный.
    
#!/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
Decrease
Increase
Decrease
Same
Increase
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

   sort, cmp, leg, <=>, $^a      charta situs       nota LIX <<     >> nota LXI   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011