像我之前的许多不幸的程序员一样,我目前正在处理一种拒绝死亡的古老文件格式。我说的是~1970 年的格式规范过时了。如果完全由我决定,我们会抛弃文件格式和任何知道如何处理它的工具,从头开始。我可以梦想,但不幸的是,这不会解决我的问题。
格式:定义很松散,因为多年的荒谬修订几乎破坏了它曾经拥有的所有向后兼容性。基本上,唯一不变的是有部分标题,对于这些行之前或之后的内容几乎没有规则。标题是连续的(例如,HEADING1、HEADING2、HEADING3、...),但没有编号并且不是必需的(例如,HEADING1、HEADING3、HEADING7)。值得庆幸的是,所有可能的航向排列都是已知的。这是一个假的例子:
# Bunch of comments
SHOES # First heading
# bunch text and numbers here
HATS # Second heading
# bunch of text here
SUNGLASSES # Third heading
...
我的问题:我需要通过这些部分标题连接多个这些文件。我有一个 perl 脚本可以很好地做到这一点:
while(my $l=<>) {
if($l=~/^SHOES/i) { $r=\$shoes; name($r);}
elsif($l=~/^HATS/i) { $r=\$hats; name($r);}
elsif($l=~/^SUNGLASSES/i) { $r=\$sung; name($r);}
elsif($l=~/^DRESS/i || $l=~/^SKIRT/i ) { $r=\$dress; name($r);}
...
...
elsif($l=~/^END/i) { $r=\$end; name($r);}
else {
$$r .= $l;
}
print STDERR "Finished processing $ARGV\n" if eof;
}
正如您所看到的,使用 perl 脚本,我基本上只是在获得某个模式匹配时更改引用指向的位置,并将文件的每一行连接到其各自的字符串,直到获得下一个模式匹配。然后将这些作为一个大的连接文件打印出来。
我会并且可以坚持使用 perl,但我的需求每天都变得越来越复杂,我真的很想看看如何用 python 优雅地解决这个问题(可以吗?)。到目前为止,我在 python 中的方法基本上是将整个文件加载为字符串,搜索标题位置,然后根据标题索引拆分字符串并连接字符串。这需要大量的正则表达式、if 语句和变量来处理在另一种语言中看起来如此简单的东西。
看来这真的归结为一个基本的语言问题。与其他按引用调用的语言相比,我发现了一个关于 python 的“按对象调用”样式的非常好的 SO 讨论。 如何通过引用传递变量? 然而,我仍然想不出一种优雅的方式在 python 中做到这一点。如果有人可以帮助我朝着正确的方向前进,将不胜感激。