I'm running a regular expression against a large scalar. Though this match isn't capturing anything, my process grows by 30M after this match:
# A
if (${$c} =~ m/\G<<\s*/cgs)
{
#B
...
}
$c
is a reference to a pretty big scalar (around 21M), but I've verified that pos(${$c})
is in the right place and the expression matches at the first character, with pos(${$c})
being updated to the correct place after the match. But as I mentioned, the process has grown by about 30M between #A and #B, even though I'm not capturing anything with this match. Where is my memory going?
Edit: Yes, use of $&
was to blame. We are using Perl 5.8.8, and my script was using Getopt::Declare, which uses the built-in Text::Balanced. The 1.95 version of this module was using $&
. The 2.0.0 version that ships with Perl 5.10 has removed the reference to $&
and alleviates the problem.