Статьи Королевства Дельфи


4. Реализация и использование


Обработка текста реализована в модуле tem.pm. Процедура tem() получает три параметра: temname, outname и params. Первые два задают, соответственно имя файла шаблона и имя выходного генерируемого файла. Оба они могут быть неопределённы (undef). В этом случае случае будут использованы стандартный вводной поток (STDIN) и стандартный выводной поток соответственно. Третьим параметром передаётся в текстовом виде список параметров шаблона. Всю работу по замене вхождений параметров шаблона в текст их значениями выполняет процедура tem_process(). Хендлы файлов шаблона и генерируемого файла предаются ей параметрами, а наименования параметров и соответствующих им ключей - через переменную модуля хеш-таблицу params, в виде ключей хеша и их значений соответственно. Она обрабатывет текстовой файл построчно, и производит поочерёдно замену всех вхождений параметров значениями в тексте каждой строки. Сформированая при замене строка выводится как строка сгенерированного файла. Ниже приведён текст модуля tem.pm:

use File::Basename; my %params; sub tem_process { my $fin = shift; my $fout = shift; while () { chomp($l = $_); foreach (keys(%params)) { my $ppp = qr/\/; my $val = $params{$_}; $l =~ s/$ppp/$val/g; } print $fout $l,"\n"; } } sub tem { $temname = shift; $outname = shift; $params = shift; if ($temname) { open FIN,$temname die "can't open TEM\n"; } else { FIN = STDIN; } if ($outname) { open FOUT,'>',$outname die "can't open tem OUT\n"; } else { FOUT = STDOUT; } %params = eval '('.$params.')'; $params{"ModName"} = basename($outname,".pas",".PAS"); # а кроме pas ? tem_process(FIN,FOUT); close(FIN) if ($temname); close(FOUT) if ($outname); } 1; __END__

Просмотр исходных файлов и выполнение запросов на инстанциацию (генерацию экземляра исходного модуля по шаблону) осуществляется скриптом temss.pl (ss - это сокращение от "scan sources" - сканирование исходных). Пояснений здесь требует, пожалуй только шаблон поиска запросов: "/!TEM!(\s|\n)*(\S+)(\s|\n)*(\S+)(\s|\n)*((.|\n)*?)(\s|\n)*!MET!/" Он соответствует текстовым последовательностям, заключенным между "!TEM!" и "!MET!" (расположенных на отдельных строках), состоящим из двух строк с ненулевыми непробельными последовательностями, и любого количества строк с последовательностями любых символов. Значимые строки запроса могут перемежаться любым количеством пустых строк. Текстовой файл загружается в память целиком (обычная практика в Perl, он это умеет делать очень быстро) и по нему осуществляется глобальный поиск с приведённым выше шаблоном с последующим выполнением обнаруженных запросов. Ниже приведён текст скрипта:




Начало  Назад  Вперед