На этом шаге мы рассмотрим создание и использование массива массивов.
Сформируем массив @calendar, используя результаты предыдущего шага.
for $i (1,3..12) { for $j (1..30) { $calendar[$i-1][$j-1] = &$f($i,$j); for $i (1,3,5,7,8,10,12) { $calendar[$i-1][30] = &$f($i, 31); } for $j (1..28) { $calendar[1][$j-1] = &$f(2, $j); } } } # Если год високосный, то добавляется еще один элемент массива. # $calendar[1][28] = &$f(2,29);
Массив @calendar состоит из 12 элементов по числу месяцев в году. Каждый элемент массива является ссылкой на другой массив, имеющий столько элементов, сколько дней в соответствующем месяце. Значениями элементов вложенных массивов являются названия соответствующих дней недели: "Monday (Понедельник)", "Tuesday (Вторник)", "Wednesday (Среда)", "Thursday (Четверг)", "Friday (Пятница)", "Saturday (Суббота)", "Sunday (Воскресенье)".
Обращаем внимание на то, что при формировании массива @calendar осуществляется неявное создание ссылок $calendar[$i] и применяется компактная запись $calendar[$i][$j] для обозначения индивидуального элемента двумерного массива.
Содержимое массива @calendar можно вывести для просмотра при помощи следующих операторов:
for $i (0..11) { for $j (0..$#{$calendar[$i]}) { print $j+1, ".",$i+1, " is $calendar[$i][$j] \n"; } }
Напомним, что запись $#array обозначает верхнее значение индекса массива @аrrау. В результате выполнения данного цикла будет выведена длинная последовательность строк вида:
Рис.1. Результат работы приложения
Приведем полный текст приложения:
$f = GetDay(2006,1,1); for $i (1,3..12) { for $j (1..30) { $calendar[$i-1][$j-1] = &$f($i,$j); for $i (1,3,5,7,8,10,12) { $calendar[$i-1][30] = &$f($i, 31); } for $j (1..28) { $calendar[1][$j-1] = &$f(2, $j); } } } # Если год високосный, то добавляется еще один элемент массива. # $calendar[1][28] = &$f(2,29); for $i (0..11) { for $j (0..$#{$calendar[$i]}) { print $j+1, ".",$i+1, " is $calendar[$i][$j] \n"; } } exit; sub GetDay { my $year = shift; my @days = (0,31,59,90,120,151,181,212,243,273,304,334); my @week = ("Monday (Понедельник)", "Tuesday (Вторник)", "Wednesday (Среда)", "Thursday (Четверг)", "Friday (Пятница)", "Saturday (Суббота)", "Sunday (Воскресенье)"); my $previous_years_days = ($year - 1)*365 + int ( ($year-1) /4) - int ( ($year-1)/100) + int ( ($year-1)/400); return sub { my ($month, $day) =@_; my $n = $previous_years_days + $days[$month-1] + $day - 1; $n++ if ($year%4 == 0 and $year%100 != 0 or $year%400 == 0 and $month > 2); return $week[$n%7]; } }
На следующем шаге мы рассмотрим создание других структур данных.