Хранение данных в тексте программы
Проблема
Некоторые данные должны распространяться вместе с программой и интерпретироваться как файл,
но при этом они не должны находиться в отдельном файле.
Решение
Лексемы __DATA__ и __END__ после исходного текста программы отмечают начало блока данных,
который может быть прочитан программой или модулем через файловый манипулятор DATA.
В модулях используется лексема __DATA__:
while (<DATA>) {
# Обработать строку
}
__DATA__
# Данные
Аналогично используется __END__ в главном файле программы:
while (<main::DATA>) {
# Обработать строку
}
__END__
# Данные
Комментарий
Лексемы __DATA__ и __END__ обозначают логическое завершение модуля или сценария перед
физическим концом файла. Текст, находящийся после __DATA__ или __END__, может быть прочитан
через файловый манипулятор DATA уровня пакета. Предположим, у нас имеется гипотетический
модуль Primes; текст после __DATA__ в файле Primes.pm может быть прочитан через файловый
манипулятор Primes::DATA.
Лексема __END__ представляет собой синоним __DATA__ в главном пакете. Текст, следующий
после лексем __END__ в модулях, недоступен.
Появляется возможность отказаться от хранения данных в отдельном файле и перейти к построению
автономных программ. Такая возможность нередко используется для документирования. Иногда в
программах хранятся конфигурационные или старые тестовые данные, использованные при разработке
программ, — они могут пригодиться в процессе отладки.
Манипулятор DATA также применяется для определения размера или даты последней модификации
текущей программы или модуля. В большинстве систем переменная $0 содержит полное имя файла для
работающего сценария. В тех системах, где значение $0 оказывается неверным, можно воспользоваться
манипулятором DATA для определения размера, даты модификации и т. д. Вставьте в конец файла
специальную лексему __DATA__ (и предупреждение о том, что __DATA__ не следует удалять), и
файловый манипулятор DATA будет связан с файлом сценария.
Use POSIX qw(strftime);
$raw_time = (stat(DATA))[9];
$size = -s DATA;
$kilosize = int($size / 1024).'k';
print "Script size is $kilosize\n";
print strftime("Last script update: %c (%Z)\n", localtime($raw_time) );
__DATA__
DO NOT REMOVE THE PRECEDING LINE
Everything else in this file will be ignored.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|