Я пытаюсь записать несколько файлов отчетов, используя perl. Каждый файл имеет одинаковую структуру, но с разными данными. Итак, мой основной код выглядит примерно так:
#begin code
our $log_fh;
open %log_fh, ">" . $logfile
our $rep;
if (multipleReports)
{
while (@reports) {
printReport($report[0]);
}
}
sub printReports
{
open $rep, ">" . $[0];
printHeaders();
printBody();
close $rep;
}
sub printHeader() {
format HDR =
@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$generatedLine
.
format HDR_TOP =
.
$rep->format_name("HDR");
$rep->format_top_name("HDR_TOP");
$generatedLine = "test";
write($rep);
$generatedLine = "next item";
write($rep);
$generatedLine = "last header item";
write($rep);
}
sub printBody #There are multiple such sections in my code. For simplicity, I have just shown 1 here
{
#declare own header and header top. Set report to use these and print items to $rep
}
#end code
Выше приведен только высокий уровень кода, который я использую, и я надеюсь, что уловил все существенные моменты. Однако по какой-то причине я правильно вывел первый файл отчета. Второй файл вместо того, чтобы иметь в первом разделе
тест
следующий предмет
последний пункт
читает
последний пункт
последний пункт
последний пункт
Я перепробовал множество вариантов, в первую очередь, для автоматической промывки, но, по жизни, не могу понять, почему он это делает. Я использую Perl 5.8.2. Любая помощь / указатели очень ценятся.
Спасибо
George
Редактировать 1
Я попытался передать дескриптор файла в качестве параметра подпрограммам, но все еще видел проблему.
Затем я переместил оператор формата за пределы подпрограммы и объявил переменную, сгенерированную $, как глобальную. Это, казалось, исправило это. Я думаю, что по какой-то причине объявление формата каждый раз, когда вызывается подпрограмма, казалось, портит ее. Не знаю точно, почему.
Странно то, что я переместил оператор формата обратно в подпрограмму (мне не нравилась идея объявить все переменные во всех моих операторах формата глобальными). Но на этот раз я изменил объявление на
my $generatedLine = "";
my $format = "format HDR = \n" .
'@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' . "\n" .
'$generatedLine' . "\n" .
'.';
my $formatTop = "format HDR_TOP = \n".
'.';
eval $format;
eval $formatTop;
Кажется, это тоже работает - я вижу правильные результаты в нескольких файлах (ну, в настоящее время я тестирую только с 2 файлами, завтра буду проводить еще тестирование).
Есть идеи, почему объявление формата таким образом работает? Что-то особенное происходит с Eval?
Спасибо
George