Я опытный разработчик, но не в Perl. Я обычно учу Perl взламывать скрипт, потом снова забываю его до следующего раза. Поэтому я ищу совет от профи.
На этот раз я создаю серию сценариев анализа данных. В целом, структура программы выглядит следующим образом:
01 my $config_var = 999;
03 my $result_var = 0;
05 foreach my $file (@files) {
06 open(my $fh, $file);
07 while (<$fh>) {
08 &analyzeLine($_);
09 }
10 }
12 print "$result_var\n";
14 sub analyzeLine ($) {
15 my $line = shift(@_);
16 $result_var = $result_var + calculatedStuff;
17 }
В реальной жизни существует до полудюжины различных config_var
с и result_var
с.
Эти сценарии отличаются в основном значениями, присвоенными config_var
с. Основной цикл будет одинаковым во всех случаях, и analyzeLine()
будет в основном одинаковым, но может иметь небольшие отклонения.
Я могу достичь своей цели, сделав N копий этого кода с небольшими изменениями здесь и там; но это грубо нарушает все виды правил хорошего дизайна. В идеале я хотел бы написать серию сценариев, содержащих только набор инициализаций config var, за которыми следует
do theCommonStuff;
Обратите внимание, что config_var
(и его братья и сестры) должны быть доступны общему коду, как и result_var
и его аналоги, по которым analyzeLine()
выполняет некоторые вычисления.
Должен ли я упаковать свой "общий" код в модуль? Создать класс? Использовать глобальные переменные?
Хотя это не совсем код игры в гольф, я ищу простое и компактное решение, которое позволит мне СУХОЙ и писать код только для различий. Я думаю, что я бы предпочел не выгружать код из огромной таблицы, содержащей все конфиги, и, конечно, не адаптировать его для использования базы данных.
Ждем ваших предложений и спасибо!
Обновление
Так как люди спрашивали, вот real analyzeLine
:
# Update stats with time and call data in one line.
sub processLine ($) {
my $line = shift(@_);
return unless $line =~ m/$log_match/;
# print "$1 $2\n";
my ($minute, $function) = ($1, $2);
$startMinute = $minute if not $startMinute;
$endMinute = $minute;
if ($minute eq $currentMinute) {
$minuteCount = $minuteCount + 1;
} else {
if ($minuteCount > $topMinuteCount) {
$topMinute = $currentMinute;
$topMinuteCount = $minuteCount;
printf ("%40s %s : %d\n", '', $topMinute, $topMinuteCount);
}
$totalMinutes = $totalMinutes + 1;
$totalCount = $totalCount + $minuteCount;
$currentMinute = $minute;
$minuteCount = 1;
}
}
Поскольку эти переменные в значительной степени взаимозависимы, я думаю, что функциональное решение с отдельными вычислениями не будет практичным. Я прошу прощения за вводящих в заблуждение людей.