用于后处理的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;
}
}

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

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

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

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

谢谢

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

如果你想的话,你唯一能做的就是稍微模块化代码:

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;
}
}

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

如果没有,即使代码只有几个例外,也可能最好坚持您描述的原始方法。

最新更新