代码之家  ›  专栏  ›  技术社区  ›  SCdF

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

  •  5
  • SCdF  · 技术社区  · 17 年前

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

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

    编辑:是的,使用 $& 这是罪魁祸首。我们使用的是Perl 5.8.8,我的脚本使用的是 Getopt::Declare ,它使用内置的 Text::Balanced . 此模块的1.95版本正在使用 . Perl5.10附带的2.0.0版本删除了对 $&

    1 回复  |  直到 17 年前
        1
  •  20
  •   Ian    17 年前

    只是一个快速的精神检查,你是说$&,$`吗或者$'(有时称为$MATCH、$PREMATCH和$POSTMATCH)在代码中的任何位置?如果是这样的话,Perl将复制整个字符串 每一个

    在本例中,“在您的代码中”是指间接地,包括使用引用这些变量的模块,或编写 use English 而不是 use English qw( -no_match_vars ) .

    如果您不确定,可以使用 Devel::SawAmpersand 模块,以确定它们是否已被使用,以及 Devel::FindAmpersand 弄明白 哪里 它们被使用。

    干杯,

    保罗