PERL - статьи

       

Программа вывода номеров журнала


Еще один пример использования хеша массивов для вывода содержания журнала за несколько лет календарем. Есть директория с файлами содержания журнала по номерам вида:

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


Содержание раздела