Шаг 63.
Использование ссылок. Массив массивов

    На этом шаге мы рассмотрим создание и использование массива массивов.

    Сформируем массив @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]; }
}
Текст этого примера можно взять здесь.

    На следующем шаге мы рассмотрим создание других структур данных.




Предыдущий шаг Содержание Следующий шаг