加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

皮条客我的Perl代码

发布时间:2020-12-15 23:29:35 所属栏目:大数据 来源:网络整理
导读:我是一位经验丰富的开发人员,但不是Perl.我通常学习Perl来破解脚本,然后我再次忘记它直到下一次.因此,我正在寻找专业人士的建议. 这一次,我正在构建一系列数据分析脚本.大致简化,程序结构如下: 01 my $config_var = 999;03 my $result_var = 0;05 foreach m
我是一位经验丰富的开发人员,但不是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";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读