gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:26:45 24 4
gpt4 key购买 nike

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

最佳答案

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

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

如果不确定,可以使用 Devel::SawAmpersand模块来确定它们是否已被使用,以及 Devel::FindAmpersand找出它们的用途。

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

干杯,

保罗

关于regex - 为什么我的 Perl 正则表达式使用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/165660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com