Иллюстрированный самоучитель по Perl

Использование ссылок

Для вывода ключей в порядке следования дней недели воспользуемся встроенной функцией сортировки sort SUBNAME LIST.

Замечание
Функция sort () сортирует список LIST и возвращает отсортированный список значений. По умолчанию используется обычный лексикографический (словарный) порядок сортировки. Его можно изменить при помощи аргумента SUBNAME, представляющего собой имя подпрограммы. Подпрограмма SUBNAME возвращает целое число, определяющее порядок следования элементов списка. Любая процедура сортировки состоит из последовательности сравнений двух величин. Для того чтобы правильно задать порядок сортировки, надо представить себе SUBNAME как функцию двух аргументов. В данном случае аргументы в подпрограмму SUBNAME передаются не общим для Perl способом – через массив @_, а через переменные $а и $ь, обозначающие внутри подпрограммы соответственно первый и второй аргумент. Подпрограмму SUBNAME надо составить таким образом, чтобы она возвращала положительное целое, нуль, отрицательное целое, когда при сравнении аргумент $а назначается меньшим аргумента $ь, равным аргументу $b, большим аргумента $ь соответственно. Для этого внутри подпрограммы удобно использовать операции числового (< ›) и строкового (стр) сравнения, возвращающие значения – 1.0, 1, если первый аргумент соответственно меньше второго, равен второму, больше второго.

Вместо имени подпрограммы в качестве аргумента SUBNAME может использоваться блок, определяющий пррядок сортировки.

Зададим функцию weekOrder, определяющую порядок сортировки:

sub WeekOrder {
my %week=("Monday" › 0,
"Tuesday" › 1,
"Wednesday" › 2,
"Thursday" › 3,
"Friday" › 4,
"Saturday" › 5,
"Sunday" › 6); $week{$a}< › $week{$b} };

Используя функцию sort () с заданным порядком сортировки:

for $i (0..11) {
print "month # ", $1+1, "\n";
for $DayName (sort WeekOrder keys %{$months[$i]})
 { print " $DayName @{$months[$i]{$DayName}}\n";
} ' ' };

…получим структурированный вывод календаря в виде, упорядоченном по месяцам и дням недели:

month f 1
Monday 3 10 17 24 31
Tuesday 4 11 18 25
Wednesday 5 12 19 26
Thursday 6 13 20 27
Friday 7 14 21 28
Saturday 1 8 15 22 29
Sunday 2 9 16 23 30

В качестве следующего примера построим на основе массива gmonths новую структуру, которую можно было бы назвать "хеш-массив хеш-массивов массивов", если бы такое название имело право на существование. В действительности, все просто. Речь идет о том, чтобы заменить в массиве @months числовые индексы ключами, совпадающими с названиями месяцев, и таким образом получить ассоциативный массив %months со сложной внутренней структурой (см. рис. 9.3).

Иллюстрированный самоучитель по Perl › Ссылки › Использование ссылок
Рис. 9.3. Ассоциативный массив %months со сложной внутренней структурой

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.