用于后处理的perl代码结构

用于后处理的perl代码结构,perl,code-structure,Perl,Code Structure,我的问题有点抽象,但我会在发言中尽量澄清。(这是一篇有点“橡皮鸭效应”的帖子,所以如果只是把它打出来就能让我有所收获的话,我会很感激的。不过,回复会很好!) 我有旧的fortran代码,我不能更改(至少现在还不能),所以我被它笨拙的输出所困扰 我正在使用perl对注释不好的ascii输出文件进行后期处理,正如您可能想象的那样,这些文件是文本和数字的一种非常特殊的混合体。“啊,完美的perl目标,”你说。是的。但我最近得出的结论是,我想到的是非常糟糕的编码 我的问题是关于人们为了实现这样一个目标而

我的问题有点抽象,但我会在发言中尽量澄清。(这是一篇有点“橡皮鸭效应”的帖子,所以如果只是把它打出来就能让我有所收获的话,我会很感激的。不过,回复会很好!)

我有旧的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;
   }
}
无论如何,如果我的漫无边际能激发出任何想法,我会很感激听到它们


谢谢

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


如果没有,即使代码中只有少数例外,也最好还是坚持您描述的原始方法。

您的原始结构非常好。您正在构建一个状态机,并以一种完全合理的方式来实现它,而这种方式无法真正变得更加惯用

如果您希望将代码模块化一点点,那么您唯一可以做的就是:

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;
   }
}
our%state=(last=>0,current=>0,next=>0);
我们的%额外标志=();
sub cond1($line){return$next_state}#如果cond==false,则返回0
sub-cond2($line){return$next_state}#如果cond==false,则返回0
我们的%条件=(
0=>\&cond1
设置了1=>\&cond2#标志1
);
而(){
my$state=$state->{current};
if($state->{next}=$conditions{$state}->($\$state)){
$do_stuff{$state}->{$next_state}->($line);
$state->{last}=$state->{current};
$state->{current}=$state->{next};
下一个
}
}

您需要提供输入格式的示例以及您所期望的内容谢谢jordanm的评论。理想情况下,这将是一条道路,我理解这一点。我选择了伪代码方法,因为我不想用一个特别难看的应用程序的细节来加重问题的负担。我必须经常做这类事情,所以我认为抽象方法可能会产生更普遍适用的东西。多亏了@DVK接受的答案,我没有失望。那正是我想要的那种东西。谢谢。正是我要找的那种东西。投票通过并被接受。是的,我将尝试两种方法,结合@DVK建议的模块化。
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;
   }
}