皮条客我的Perl代码
|
我是一位经验丰富的开发人员,但不是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_varn";
14 sub analyzeLine ($) {
15 my $line = shift(@_);
16 $result_var = $result_var + calculatedStuff;
17 }
在现实生活中,最多有大约六个不同的config_vars和result_vars. 这些脚本主要区别于分配给config_vars的值.主循环在每种情况下都是相同的,analyzeLine()将大致相同但可能有一些小的变化. 我可以通过制作此代码的N份副本来实现我的目的,并且在这里和那里进行小的改动;但这严重违反了各种良好设计规则.理想情况下,我想编写一系列脚本,其中只包含一组config var初始化,然后是 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 $2n";
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 : %dn",'',$topMinute,$topMinuteCount);
}
$totalMinutes = $totalMinutes + 1;
$totalCount = $totalCount + $minuteCount;
$currentMinute = $minute;
$minuteCount = 1;
}
}
由于这些变量在很大程度上是相互依赖的,我认为单独计算的功能解决方案是不切实际的.我为误导人道歉. 解决方法
继续创建一个类层次结构.您的任务是OOP编程风格的理想选择.
这是一个例子: package Common;
sub new{
my $class=shift;
my $this=bless{},$class;
$this->init();
return $this;
}
sub init{}
sub theCommonStuff(){
my $this=shift;
for(1..10){ $this->analyzeLine($_); }
}
sub analyzeLine(){
my($this,$line)=@_;
$this->{'result'}.=$line;
}
package Special1;
our @ISA=qw/Common/;
sub init{
my $this=shift;
$this->{'sep'}=','; # special param: separator
}
sub analyzeLine(){ # modified logic
my($this,$line)=@_;
$this->{'result'}.=$line.$this->{'sep'};
}
package main;
my $c = new Common;
my $s = new Special1;
$c->theCommonStuff;
$s->theCommonStuff;
print $c->{'result'}."n";
print $s->{'result'}."n";
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
