Еще один пример использования хеша массивов для вывода содержания журнала за несколько лет календарем. Есть директория с файлами содержания журнала по номерам вида:
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){#цикл по отсортированным в порядке возрастания годам