为什么我的Perl正则表达式使用了这么多内存?

时间:2008-10-03 04:10:22

标签: regex perl memory-management

我正在对大型标量运行正则表达式。虽然这场比赛没有捕捉到任何东西,但我的过程在这场比赛后增长了30M:

# A
if (${$c} =~ m/\G<<\s*/cgs)
{
    #B
    ...
}

$c是对一个相当大的标量(大约21M)的引用,但我已经验证pos(${$c})位于正确的位置,表达式匹配第一个字符,{{1在比赛结束后更新到正确的位置。但正如我所提到的,这个过程在#A和#B之间增长了大约30M,尽管我没有用这个匹配捕获任何东西。我的记忆在哪里?

编辑:是的,使用pos(${$c})是罪魁祸首。我们使用的是Perl 5.8.8,我的脚本使用Getopt::Declare,它使用内置的Text::Balanced。该模块的1.95版本使用$&。 Perl 5.10附带的2.0.0版本删除了对$&的引用并缓解了问题。

1 个答案:

答案 0 :(得分:20)

只是一个快速的健全性检查,你在代码中的任何地方提到$&amp;,$`或$'(有时称为$ MATCH,$ PREMATCH和$ POSTMATCH)?如果是这样,Perl将复制每个正则表达式匹配的整个字符串,以防您想要检查这些变量。

“在您的代码中”在这种情况下是间接的,包括使用引用这些变量的模块,或者编写use English而不是use English qw( -no_match_vars )

如果您不确定,可以使用Devel::SawAmpersand模块确定它们是否已被使用,并Devel::FindAmpersand找出使用的位置。< / p>

内存增加可能还有其他原因(你正在使用哪个版本的Perl?),但如果使用了匹配变量肯定会打破你的记忆,因此很可能是罪魁祸首。

Cheerio,