47. Как отсортировать хеш в Perl 6

Для сортировки хеша в Perl 6 желательно знать, что такое placeholder variable. Как только эта концепция становится понятна, писать условие сортировки становится крайне просто.

Например, создадим хеш с расстояниями до разных городов от Москвы:

my %distance = 
    Владимир    => 185,
    Волгоград   => 1000,
    Калининград => 1227,
    Мурманск    => 1895,
    Новосибирск => 3550;

Теперь задача найти отсортировать элементы по увеличению расстояния.

say %distance.sort({$^a.value <=> $^b.value});

В общем-то, готово. Программа печатает то что надо:

(Владимир => 185 Волгоград => 1000 Калининград => 1227 
Архангельск => 1261 Астрахань => 1411 Мурманск => 1895 
Новосибирск => 3550)

Давайте разберемся, что происходит внутри блока, переданного в метод sort.

Во-первых, переменные $^a и $^b — это плейсхолдеры, которые являются аргументами анонимного блока и сортируются по алфавиту. То есть с тем же успехом их можно было бы назвать $^x и $^y или $^var1 и $^var2.

Во-вторых, внутри этих переменных оказываются объекты типа Pair, который содержит поля key и value:

say %distance.sort({
    say $^a.key ~ ', ' ~ $^a.value ~ ' vs. ' ~ 
        $^b.key ~ ', ' ~ $^b.value;
    $^a.value <=> $^b.value
});

Таким способом мы сможем увидеть, какие пары получает метод сортировки:

Владимир, 185 vs. Новосибирск, 3550
Калининград, 1227 vs. Волгоград, 1000
Мурманск, 1895 vs. Астрахань, 1411
Владимир, 185 vs. Волгоград, 1000
Новосибирск, 3550 vs. Волгоград, 1000
Новосибирск, 3550 vs. Калининград, 1227
Астрахань, 1411 vs. Архангельск, 1261
Владимир, 185 vs. Архангельск, 1261
Волгоград, 1000 vs. Архангельск, 1261
Калининград, 1227 vs. Архангельск, 1261
Новосибирск, 3550 vs. Архангельск, 1261
Новосибирск, 3550 vs. Астрахань, 1411
Новосибирск, 3550 vs. Мурманск, 1895

Если вы не хотите использовать плейсхолдеры, можно явно объявить аргументы анонимного блока явно и использовать их при сортировке:

say %distance.sort( -> $город1, $город2 {
    $город1.value <=> $город2.value
});

One thought on “47. Как отсортировать хеш в Perl 6

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s