5

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

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

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

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

4

1 回答 1

20

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

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

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

内存增加可能还有其他原因(您使用的是哪个版本的 Perl?),但是如果使用匹配变量,它们肯定会破坏您的内存,因此可能是罪魁祸首。

干杯,

保罗

于 2008-10-03T04:21:32.680 回答