【发布时间】:2010-01-19 12:53:02
【问题描述】:
我是一位经验丰富的开发人员,但不是 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_vars 和 result_vars 最多有六种不同的类型。
这些脚本的主要区别在于分配给config_vars 的值。主循环在每种情况下都是相同的,analyzeLine() 基本相同,但可能会有一些小的变化。
我可以通过复制这段代码来实现我的目的,在这里和那里做一些小的改动;但这严重违反了各种良好设计的规则。理想情况下,我想编写一系列脚本,其中只包含一组配置变量初始化,然后是
do theCommonStuff;
请注意,config_var(及其同级)必须可用于公共代码,result_var 及其类似代码也必须如此,analyzeLine() 对此进行一些计算。
我应该将我的“通用”代码打包到一个模块中吗?创建一个班级?使用全局变量?
虽然不完全编写高尔夫代码,但我正在寻找一种简单、紧凑的解决方案,让我可以干涸并仅为差异编写代码。我想我宁愿不要将代码从包含所有配置的巨大表中删除,当然也不会将其调整为使用数据库。
期待您的建议,谢谢!
更新
既然有人问,这里是真实的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;
}
}
由于这些变量在很大程度上是相互依赖的,我认为单独计算的函数式解决方案并不实用。我为误导人们道歉。
【问题讨论】:
-
你能给我们一个实际的例子来说明你想用这个实现什么吗?这看起来是使用函数式编程的好机会。
标签: perl refactoring coding-style