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

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

概述我正在对大型标量运行正则表达式.虽然这场比赛没有捕获任何东西,但我的过程在这场比赛后增长了30M: # Aif (${$c} =~ m/\G<<\s*/cgs){ #B ...} $c是对一个非常大的标量(大约21M)的引用,但我已经验证了pos(${$c})位于正确的位置并且表达式匹配第一个字符,带有pos(${$c })在比赛结束后更新到正确的位置.但正如我所提到的,这个 我正在对大型标量运行正则表达式.虽然这场比赛没有捕获任何东西,但我的过程在这场比赛后增长了30M:

# Aif (${$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版本删除了对$& amp;的引用.并缓解这个问题.

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

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

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

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

Cheerio,

保罗

总结

以上是内存溢出为你收集整理的为什么我的Perl正则表达式使用了这么多内存?全部内容,希望文章能够帮你解决为什么我的Perl正则表达式使用了这么多内存?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1270666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存