Дополнительные сведения о форматах и отчетах в Perl можно узнать из стандартной документации, обратившись за помощью к утилите
perldoc perlform
В завершение лекции приведем пример законченной программы (с образцом исходных данных), выводящей отчет о книгах по языку Perl.
open my $report, '>', '/report.txt' or die;
$old_handle = select $out; # выбрать поток для отчета
select $report;
$^ = 'HEAD';
$~ = 'REPORT';
# описание форматов для отчета
while(<DATA>) { # чтение одной записи данных
($authors, $title, $year, $nick) = split ':';
write $report; # вывод одной строки отчета
}
close $report or die;
# формат для заголовка страницы
format HEAD =
Классические книги по языку Perl
издательства O'Reilly
Лист @#
$%
---------------+--------------------+----+------------
Авторы | Заглавие |Год | Прозвище
---------------+--------------------+----+------------
.
format REPORT =
^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<|@###|@>>>>>>>>>>>
$authors, $title, $year, $nick
^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<| | ~~
$authors, $title
---------------+--------------------+----+------------
.
__DATA__
Cozens S.:Advanced Perl Programming,2nd ed.:2005:Panther Book
Friedl J.E.F.:Mastering Regular Expressions:1997:Owls Book
...
Результатом работы этой программы будет такой отчет, размещенный в файле report.txt:
Классические книги по языку Perl
издательства O'Reilly
Лист 1
---------------+--------------------+----+------------
Авторы | Заглавие |Год | Прозвище
---------------+--------------------+----+------------
Cozens S. |Advanced Perl |2005|Panther Book
|Programming,2nd ed. | |
---------------+--------------------+----+------------
Friedl J.E.F. |Mastering Regular |1997| Owls Book
|Expressions | |
---------------+--------------------+----+------------
Schwartz R.L., |Learning Perl, 4th |2005| Llama Book
Phoenix T., |ed. | |
brian d foy | | |
---------------+--------------------+----+------------
Конечно, изученные в этой лекции средства отчетов не могут сравниться с современными специализированными построителями отчетов, но во многих случаях бывает достаточно форматирования выходных данных в виде простых отчетов, которое в Perl делается достаточно легко, просто и наглядно. Эта лекция была "лирическим отступлением" перед тем как начать углубленное изучение техники программирования на языке Perl.
Лекция 11. Ссылки
В этой лекции будут изучены ссылки и ссылочные структуры данных, которые играют очень важную роль в Perl, так как позволяют создавать многомерные массивы, массивы записей и различные динамические структуры данных произвольной сложности: очереди, списки, деревья, графы. Кроме того, умение работать со ссылками необходимо для понимания объектно-ориентированного программирования в Perl.
Цель лекции: научиться обращаться со ссылками, объектами ссылок и структурами данных, основанными на ссылках, чтобы применять их при программировании задач со сложными структурами данных.
Ссылки явно или неявно применяются во всех языках программирования. Они позволяют гибко создавать динамические структуры данных неограниченной сложности. Ссылки являются одним из скалярных типов данных языка Perl, наряду с числами и строками. Ссылка (reference) - это информация о том, где при выполнении программы располагается в памяти объект определенного типа. Эту информацию можно использовать для доступа к объекту ссылки (referent). Ссылка - это возможность обратиться к какой-то информации не по имени, которое известно при компиляции, а по ее расположению в памяти при выполнении программы. В отличие от указателей в некоторых других языках, в Perl ссылки реализованы надежно и эффективно. Программист не должен заботиться о явном удалении из памяти объектов ссылок, поскольку занимаемая память автоматически освобождается встроенным сборщиком мусора, когда объекты ссылок перестают использоваться (то есть когда на них больше не указывает ни одна ссылка). Для создания ссылки на существующий программный объект предусмотрена операция взятия ссылки, обозначаемая обратной косой чертой (backslash), которая ставится перед объектом ссылки. В следующем примере показано, как можно получить ссылку на скалярную переменную и сохранить ее в другой переменной: