如何使用Perl快速修复大文件中的EBCDIC控制字符?

时间:2010-09-29 18:39:02

标签: windows regex perl performance

如果这是一个新手问题,我很抱歉。我不是Perl的开发人员,但我想在自动化过程中使用它,我遇到了麻烦。

以下命令在我的Linux系统(Ubuntu 9.10 x64,Perl 5.10)上运行很快(几秒钟),但在Windows系统上运行速度非常慢(Windows 2003 x86,Strawberry Perl 5.12.1.0)。

perl -pe 's/\x00\x42\x00\x11/\x00\x42\x00\xf0/sgx' inputfile > outputfile

查找/替换十六进制字符的模式旨在将EBCDIC托架控制字符固定在大小介于500MB到2GB之间的文件中。我不确定这是否是最有效的方法,但它似乎可以解决问题......如果它只能在Windows系统上快速运行它需要运行。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

请注意,Windows上的文本和二进制文件之间存在区别。文本文件受自动EOL转换的影响,我认为这可能会增加运行时间,并且可能会破坏二进制替换(可能不是这里的情况)。

此外,使用/sx进行此替换毫无意义。

我认为事情的核心归结为:使用-p开关,您应该逐行处理输入。文件中的第一个EOL(由perl理解)在哪里?您是否正在尝试将大字符串读入内存,对其执行s///并写出来?

如何使用以下脚本:

#!/usr/bin/perl

use strict; use warnings;
$/ = "\x00\x42\x00\x11";
$\ = "\x00\x42\x00\xf0";

while ( <> ) {
    chomp;
    print;
}

此外,您绝对需要在Windows上使用双引号。比较和对比:

C:\Temp> perl -pe 's/perl/merl/' t.pl
#!/usr/bin/perl
...
C:\Temp> perl -pe "s/perl/merl/" t.pl
#!/usr/bin/merl
...