如何最有效地将字符串拆分为两个并在perl中放入两个变量?

时间:2015-03-13 03:24:00

标签: regex string performance perl

我在64KB的部分文件中读取了一个非常大的文件,然后对这些部分进行了一些更改,然后将其写入输出文件。

为此,我总是需要在\>的最后一次出现时将64KB字符串分成两部分。

我当然可以编写一个工作脚本,使用rindexsubstr或正则表达式(可能)或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中所需的内容。

它需要尽可能快。我知道如果我犯了一些奇怪的错误,可能会有巨大的速度差异,但我无法在合理的时间内自行解决。

或者我应该使用完全其他方法吗?

1 个答案:

答案 0 :(得分:4)

看起来你正在用正则表达式解析HTML / XML。 Don't do that。使用现有的XML解析器。

如果关注内存,use a SAX parser会将文档作为流读取。如果性能是一个问题,那些模块中的一些是围绕用C编写的解析器的包装器,因此速度非常快。

此外,您的代码没有安全功能,并且允许某人附加到他们喜欢的任何文件。