Программа вывода номеров журнала
Еще один пример использования хеша массивов для вывода содержания журнала за несколько лет календарем. Есть директория с файлами содержания журнала по номерам вида:
1.1996.txt
2.1996.txt
3.1996.txt
4.1996.txt
5.1996.txt
...
и т.д. до
5.2001.txt
где первая цифра в названии файла это содержание журнала за данный месяц, а вторая это год.
Читаем эту директорию в массив и вызываем подпрограмму:
while(<$dir/journal/*.txt>){push(@files, $_)}
&calendar;
sub calendar{
print qq~<center><font><b>Содержание
по номерам</b></font><p></center>~;
@year1=grep{!$test{$_}++ if(/^(\d+)$/)} #выделяет число лет, за которые есть номера журнала
#и заодно удаляет одинаковыен года, т.к.
#на каждый год приходится не больше 12
#файлов: 1.1996, 2.1996, 3.1996...
map{/\.(\d+)/, $_} @files; #выделяет года и заносит их во временный массив
foreach $line(@year1){ #цикл по годам.
foreach $files(@files){
push @{$numbers{$line}}, $files if($files=~m/$line/);
#здесь производится заполнение хеша массивов ключами,
#которые являются годами, а значениями хешей буду являться
#массивы номеров журнала за данный год, который является ключом.
#т.е. в результате должно получиться что-то вида:
#%hash = (
# 1996 => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
# 1997 => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
# ...
# 2001 => ["1", "2", "3", "4", "5"] #до пятого номера потому, что
#шестой номер на момент написания этого
#примера еще не вышел.
#);
}
}
print "<center><table>"; #открываем табличку для вывода результатов
for $key (sort keys %numbers){#цикл по отсортированным в порядке возрастания годам
print "<tr><td><font size=\"1\"><b>$key: </b></font>"; #печатаем год
foreach $elem(@{$numbers{$key}}){ # вытаскиваем массив номеров журнала из хеша, ключем
#которому должен являться определенный год
if($elem=~m/\/(\d+).(\d+)\.txt/){$nj=$1; $yj=$2;
if($nj eq $nomer && $yj eq $year){#текущий номер для просмотра выделяем красным:
$temp1=qq~<font size="1" color=red><b>$nj</a> </b></font>\n~;
push(@results123, $temp);
}
else{#остальные выделяем ссылкой
$temp2=qq~<font size="1"><b><a
href="$url?month=$nj&year=$yj" class="menu">$nj</a>
</b></font>\n~;
push(@results123, $temp2)
}
}
}
#дальнейшая конструкция называется преобразованием Рэндела
#Шварца, смысл которой заключается
#в том, чтобы отсортировать массив номеров журнала по возрастанию,
#т.к. при извлечении из хеша они будут выстраиваться в порядке
#1,11,12,2,3,4...
@sort123= map{ $_ -> [1]}
sort{$a->[0] <=> $b->[0]}
map{[/>(\d+)<\/a>/, $_]} @results123;
print @sort123; #печатаем табличку номеров журнала за 1995 год
print "</td></tr>";#закрываем строку таблички
#обнуляем временные массивы
$#results123=-1;
$#sort123-1;
#возвращаемся наверх и начинаем печатать строчку
#таблицы для следующих номеров следующего года.
}
print qq~</table></center>~;
}
Все вышеописанное выглядит в виде html примерно так:
Содержание по номерам
1995: |
1996: |
1997: |
1998: |
1999: |
2000: |
2001: 5 |