
reverse
Часто приходится массивы сортировать. Ну вот попробуем как это в perl 6.
| | #!/usr/bin/perl6
my @list=<perl6.su rakudo.org perl.org perl6.ru>;
"{@list}".say;
@list=@list.sort;
"{@list}".say; | | perl6.su rakudo.org perl.org perl6.ru
perl.org perl6.ru perl6.su rakudo.org |
Что и ожидалось. А если попробовать так? | | #!/usr/bin/perl6
my @list=<perl6.su rakudo.org perl.org perl6.ru>;
"{@list}".say;
@list=@list.sort.reverse;
"{@list}".say; | | perl6.su rakudo.org perl.org perl6.ru
rakudo.org perl6.su perl6.ru perl.org |
Здесь мы сначала отсортировали, а потом перевернули массив. Bene. Далее возьмём массивчик побольше, попробуем его посортировать по критериям. Допустим у нас есть сельский роддом, в котором рождаются мальчики и девочки. Мы ведём статистику по месяцам.| | #!/usr/bin/perl6
my %vir=<jan 10 feb 9 mar 11 apr 10 maj 12 jun 13 jul 15 aug 11 sep 10 oct 7 nov 9 dec 11>;
my %fem=<jan 10 feb 8 mar 10 apr 11 maj 14 jun 10 jul 13 aug 11 sep 9 oct 8 nov 8 dec 8>;
# нам надо отсортировать месяцы по "полезности"
my @lunae=%vir.keys.sort({ %vir{$_}+%fem{$_} }).reverse;
for @lunae {
say $_,' ',%vir{$_}+%fem{$_}
} | | jul 28
maj 26
jun 23
aug 22
apr 21
mar 21
jan 20
dec 19
sep 19
nov 17
feb 17
oct 15 |
Вот. Видно, что июль - самый полезный месяц. Но надо же решить окончательно, что полезнее, март или апрель. Тогда наш вымышленный главврач решил, что надо ввести дополнительный критерий, сравнивать по девочкам. Если девочек родилось больше, то это лучше. Это не шовинизм, а простой расчёт. Потом эти девочки подрастут и тоже станут матерями. Ставим ещё один sort:| | #!/usr/bin/perl6
my %vir=<jan 10 feb 9 mar 11 apr 10 maj 12 jun 13 jul 15 aug 11 sep 10 oct 7 nov 9 dec 11>;
my %fem=<jan 10 feb 8 mar 10 apr 11 maj 14 jun 10 jul 13 aug 11 sep 9 oct 8 nov 8 dec 8>;
# нам надо отсортировать месяцы по "полезности"
my @lunae=%vir.keys.sort({ %fem{$_} }).sort({ %vir{$_}+%fem{$_} }).reverse;
for @lunae {
say $_,' ',%vir{$_}+%fem{$_}
} | | jul 28
maj 26
jun 23
aug 22
apr 21
mar 21
jan 20
sep 19
dec 19
nov 17
feb 17
oct 15 |
Просто praeclare! Здесь кроется очень приятная особенность sort: он бережно относится с предыдущим порядком. При прочих равных условиях он его сохраняет. Кстати, в нашем примере ноябрь лучше февраля потому, что он в списке позже, а при reverse список развернулся. N. B. Чем важнее критерий сравнения, тем ближе к концу цепочки сортов он должен стоять. # mutatio postrema: 10 Aug 2010
Другой полезный способ употребления unspace - разбивка строки на несколько.
| | #!/usr/bin/perl6
my @list=<parvo est natura contenta>;
@list.sort\ # это удобно для разбивки длинных строк
.join(' ... ').say; # и обильных комментариев | | contenta ... est ... natura ... parvo |
Заодно попробовали старый добрый join. Можно конечно просто разбить длинную строку, без комментариев:| | #!/usr/bin/perl6
my @list=<parvo est natura contenta>;
@list.sort\
.reverse\
.join("\n").say; | | parvo
natura
est
contenta |
Ну что же, bene est. # mutatio postrema: 26 Sep 2011
|