皮条客我的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"; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |