Hallo,
nach tagelanger Suche konnte ich eine Stelle im Modul finden, die für einen Speicherfresser sorgt:
sub GetCommandDoIf ($$)
{
my ($separator,$tailBlock) = @_;
while ($tailBlock =~ /^[^"^\[^\{^\(^$separator]*/g) {...
Wenn GetCommandDoIf im Wechsel mit ":" und "," für $separator aufgerufen wird, führt es zum Speicherzuwachs.
Ich habe zum Testen von GetCommandDoIf eine identische Kopie GetCommandDoIf2 gemacht und den ursprünglichen Aufruf
($cmd,$tailBlock,$err)=GetCommandDoIf($separator,$tailBlock);
abgeändert in:
if ($separator eq ":") {
($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
} else {
($cmd,$tailBlock,$err) = GetCommandDoIf2($separator,$tailBlock);
}
und der memory leak ist weg.
Es reicht im geänderten Code den Aufruf von GetCommandDoIf2 durch GetCommandDoIf zu ersetzen, so ist das Problem wieder da:
if ($separator eq ":") {
($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
} else {
($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
}
Leider kann ich das Problem nicht separieren, es scheint in Kombination mit dem restlichen Code des Moduls irgendwie zusammen zu hängen.
Ich vermute, dass es mit der globalen Suchfunktion (/.../g) zusammenhängt, da dann Perl sich die Position (pos(...)) global merken muss.
Hat jemand eine Idee, wie so etwas zustande kommt?