如果这是一个新手问题,我很抱歉。我不是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系统上快速运行它需要运行。
有什么想法吗?
答案 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 ...