当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么我的Perl正则表达式使用了这么多内存?》经验,为你挑选了1个好方法。

我正在对大型标量运行正则表达式.虽然这场比赛没有捕获任何东西,但我的过程在这场比赛后增长了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版本已删除了$&对该问题的引用并缓解了该问题.



1> pjf..:

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

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

如果你不知道,你可以使用杰韦利:: SawAmpersand模块,以确定它们是否已被使用,并杰韦利:: FindAmpersand找出哪里使用它们.

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

Cheerio,

保罗

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有