У меня есть существующий проект, который требует, чтобы заголовки лицензий использовались в начале каждого исходного файла. Проблема заключается в том, что заголовок лицензии не является статичным:Как продлить синтаксический анализатор заголовков исходного файла perl, чтобы сохранить существующую информацию?
#+======================================================================
# \$HeadURL [filled in by svn] \$
# \$Id [filled in by svn] \$
#
# Project : Project blah blah - only one line
#
# Description : A longer description
# which may or may not span multiple lines
#
# Author(s) : some author text
# but there may be a few more authors, too!
#
# Copyright (c) : 2010-YYYY Some company,
# and a few fixed lines of
# address
#
# and a few more lines of fixed license code
# that does not change
#
#-======================================================================
У меня есть существующий скрипт на Perl, который сканирует список файлов, чтобы определить тип файла (C, Java, Баш и т.д.) и делает элементарную проверку, см., существует ли преамбула лицензии.
Если нет, он может вставить пустой заголовок лицензии, который необходимо обновить вручную.
Но я хотел бы знать, как я могу:
- обнаружить существующую лицензию с нестатической информацией и
- Расширение существующего Perl ProcessFile ($ FileName, $ типа) функция (ниже) для сохранения существующих данных «Проект», «Описание» и «Автор (ы)»?
Я подозреваю, что мне может потребоваться разместить маркеры в шаблонах лицензий, чтобы указать динамический текст, который следует сохранить в регенерированном заголовке ..?
Не могли бы вы дать мне указания о том, как использовать регулярные выражения или шаблоны соответствия perl для захвата текущей информации о переменных, чтобы я мог снова вставить ее в заголовок и обновить год?
я могу видеть, что все волшебство должно произойти в "для ($ I = 0; $ я < 5; ++ $ я)" петля ...
sub processFile {
my $i;
my $lineno = 0;
my $filename = $_[0];
my $type = $_[1];
my @license = split(/\n/, $licenses{$type});
my @contents;
#print "$filename is a $type file\n";
tie @contents, 'Tie::File', $filename or die $!;
if ($prolog{$type}) { # should not insert license at line 0
my $len = scalar(@contents);
while ($lineno < $len) {
if ($contents[$lineno] =~ /^$prolog{$type}$/) {
last;
} else {
$lineno++;
}
}
if ($lineno >= $len) {
# no prolog, so let's just insert it into the start
$lineno = 0;
} else {
$lineno = $lineno + 1;
}
} else {
$lineno = 0;
}
# Compare the first 5 lines excluding prolog with the license
# header. If they match, the license header won't be inserted.
for ($i = 0; $i < 5; ++$i) {
my $line = $contents[$i + $lineno];
$line =~ s/\$(\w+)\:.*\$/\$$1\$/;
if ($line ne $license[$i]) {
splice @contents, $lineno, 0, @license;
push @processedFiles, $filename;
last
}
}
untie @contents;
}
То, что вы показали может быть заголовком для Баша или Perl. Java и C * могут * делиться другим. Я думаю, вам нужно будет использовать подход «обработчик языка», разделенный - * возможно * - на расширение файла. – Axeman
Много предварительная обработка уже состоялась. Эта предварительная обработка определила тип файла (например, bash или Java) и выбрала текст лицензии по умолчанию для вставки. Поэтому к моменту появления «processFile» я уже знаю язык файла и имеет соответствующий заголовок (в массиве @licenses). – KevinM