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

如果这是一个新手问题,我很抱歉。 我不是一个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 

查找/replacehex字符的模式旨在修复大小在500MB到2GB之间的EBCDIC托架控制字符。 我不确定这是否是最有效的方式,但是这似乎是一个窍门……只要它能在Windows系统上快速运行,就需要运行。

有什么想法吗?

请注意,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
 ...