我在64KB的部分文件中读取了一个非常大的文件,然后对这些部分进行了一些更改,然后将其写入输出文件。
为此,我总是需要在\>
的最后一次出现时将64KB字符串分成两部分。
我当然可以编写一个工作脚本,使用rindex
和substr
或正则表达式(可能)或reverse
,但因为这部分代码将运行百万次,我只是想知道最快的方式是什么?
我目前使用的代码是:
#!C:/xampp/perl/bin/perl.exe -w
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $q = new CGI;
my $FileToRead. = $q->param('FileToReadnameandpath');
my $FileToAppendTo = $q->param('addtofilenameandpath');
my $seekto = $q->param('seekto');
my $lengthtoload = $q->param('lengthtoload'); # 64000 currently
my $SizeFile = -s $FileToRead ;
my $content;
my $pos = 0;
my $leftover = '';
open(READFILE, "<", $FileToRead);
open(APPENDFILE, ">>", $FileToAppendTo);
seek(READFILE, $seekto, 0);
for ( $pos = 0; $pos <= $SizeFile; $pos += $lengthtoload ) {
read(READFILE, $content, $lengthtoload);
$content = $leftover.$content;
# $leftover = Text after last > in $content
# $content = content without text after last >
$content =~ s/ property="[^"]*"| prop2="[^"]*"| another="[^"]*"//g;
print APPENDFILE $content;
}
$leftover =~ s/ property="[^"]*"| prop2="[^"]*"| another="[^"]*"//g;
print APPENDFILE $leftover;
close(READFILE);
close(APPENDFILE);
print "Content-type: text/html\n\n";
print "reading and appending/writing should have been successful\n";
我昨天刚刚在Perl中编写了我的第一个测试脚本,实际上我只需要另外一条指令来完成我在Perl中所需的内容。
它需要尽可能快。我知道如果我犯了一些奇怪的错误,可能会有巨大的速度差异,但我无法在合理的时间内自行解决。
或者我应该使用完全其他方法吗?
答案 0 :(得分:4)
看起来你正在用正则表达式解析HTML / XML。 Don't do that。使用现有的XML解析器。
如果关注内存,use a SAX parser会将文档作为流读取。如果性能是一个问题,那些模块中的一些是围绕用C编写的解析器的包装器,因此速度非常快。
此外,您的代码没有安全功能,并且允许某人附加到他们喜欢的任何文件。