【问题标题】:perl code structure for post-processing用于后处理的 perl 代码结构
【发布时间】:2012-11-18 04:27:43
【问题描述】:

我的问题有点抽象,但我会尽量在我的陈述中说清楚。 (这是一个“橡皮鸭效应”的帖子,所以如果只是把它输入到某个地方,我会很感激的。不过,回复会很棒!)

我有旧的 fortran 代码,我无法更改(至少现在还没有),所以我被它笨拙的输出所困扰。

我正在使用 perl 对注释不佳的 ascii 输出文件进行后处理,正如您可能想象的那样,这些文件是文本和数字的非常特殊的混合体。 “啊,完美的 perl 目标,”你说。是的。但我最近得出的结论是,我想出的是非常糟糕的编码。

我的问题是关于人们更喜欢用来实现这样一个目标的通用结构。正如我所说,我对我选择的那个不满意。

这是我得到的结构的一些伪代码:

flag1 = 0;
flag2 = 0;
while (<INPUT>) {
   if (cond1) {
      do something [like parse and set a header];
      flag1 = 1;
   } else {
     next;
   }
   if (flag1 == 1 && cond2) {
      do something else [like process a block of data];
   } else {
     next;
   }
}

上述代码的目的是能够将处理分解为与分区不良的 ascii 文件相对应的块——文件中没有太多的“标签”,因此条件 (cond1cond2 等)参与其中。设置标志的目的之一是跟踪文件中代码的进度。

现在我想到一个更好的结构可能是

while (<INPUT>) {
   do stuff;
}

while (<INPUT>) {
   do other stuff;
}

无论如何,如果我的漫无边际激发了任何想法,我会很高兴听到它们。

谢谢

【问题讨论】:

  • 您需要提供输入格式的样本以及您的期望
  • 感谢乔丹,您的评论。理想情况下,这将是要走的路,我明白这一点。我选择了伪代码方法,因为我不想用一个特别丑陋的应用程序的细节来加重这个问题。我必须经常做这种事情,所以我认为抽象方法可能会产生更普遍适用的东西。多亏了@DVK 接受的回答,我并没有失望。这正是我一直在寻找的东西。

标签: perl code-structure


【解决方案1】:

如果文件确实适合在多个循环中进行处理,那将是一种比使用条件模拟更清晰的方法,IMO。

如果没有,即使只有少数例外情况可以编写代码,最好还是坚持使用您描述的原始方法。

【讨论】:

  • 是的,我将尝试两种方式,结合@DVK 建议的模块化。
【解决方案2】:

您的原始结构非常好。你正在构建一个状态机,并以一种完全合理的方式来完成它,而这种方式真的不能再惯用了。

如果您愿意,您唯一可以做的就是将代码模块化一点:

our %state = (last => 0, current => 0, next => 0);
our %extra_flags = ();
sub cond1($line) { return $next_state } # Returns 0 if cond==false
sub cond2($line) { return $next_state } # Returns 0 if cond==false

our %conditions = (
   0 => \&cond1
   1 => \&cond2  # flag1 is set
);

while (<INPUT>) {
   my $state = $state->{current};
   if ($state->{next} = $conditions{$state}->($_, $state)) {
      $do_stuff{$state}->{$next_state}->($line);
      $state->{last} = $state->{current};
      $state->{current} = $state->{next};
      next;
   }
}

【讨论】:

  • 谢谢。正是我一直在寻找的那种东西。投票并接受。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2010-10-03
  • 1970-01-01
  • 2016-04-08
  • 2010-12-02
相关资源
最近更新 更多