2008-10-03 57 views
5

我對大標量運行正則表達式。雖然這場比賽沒有什麼捕獲,我的過程本場比賽後,由長30M:爲什麼我的Perl正則表達式使用這麼多的內存?

# 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版本刪除了對$&的引用並緩解了該問題。

回答

20

只是一個快速的完整性檢查,你是否在代碼中的任何地方提及$ &,$`或$'(有時稱爲$ MATCH,$ PREMATCH和$ POSTMATCH)?如果是這樣,Perl會將每個的整個字符串複製爲,以防萬一您想要檢查這些變量。

「在您的代碼中」在這種情況下意味着間接地,包括使用引用這些變量的模塊,或者編寫use English而不是use English qw(-no_match_vars)

如果你不知道,你可以使用Devel::SawAmpersand模塊以確定他們是否已被使用,並Devel::FindAmpersand找出其中使用它們。

內存增加可能還有其他原因(你使用的Perl版本是?),但匹配變量肯定會打擊你的記憶,因此它們是可能的罪魁禍首。

Cheerio,

保羅

+0

當然看起來就是這樣。我無法在我的perl上運行FindAmpersand,因爲我啓用了線程,所以我正在重新編譯perl來運行此測試,但SawAmpersand正在報告是。 – 2008-10-03 05:30:41

相關問題