[英]How can I force unload a Perl module?
嗨我正在使用另一個不再在公司的人寫的perl腳本。 如果我將腳本作為獨立運行,那么輸出就像預期的那樣。 但是當我重復從另一個代碼調用腳本時,輸出錯誤,除了第一次。
我懷疑一些變量沒有正確初始化。 當它被稱為獨立時,每次退出時,所有變量值都初始化為默認值。 但是當從另一個perl腳本調用時,模塊和變量值可能會轉移到下一次調用腳本。
在下次調用之前,有沒有辦法從內存中清除被調用的腳本?
我嘗試啟用警告,它拋出了1000行警告......!
編輯:我如何調用其他腳本:
代碼如下所示:
do "processing.pl";
...
...
...
process(params); #A function in processing.pl
...
...
...
如果要強制重新加載模塊,請從%INC
刪除其條目,然后重新加載。
例如:
sub reload_module {
delete $INC{'Your/Silly/Module.pm'};
require Your::Silly::Module;
Your::Silly::Module->import;
}
請注意,如果此模塊依賴於正在設置的其他模塊中的全局變量,則可能還需要重新加載這些模塊。 沒有在代碼中達到高峰就沒有簡單的方法可以知道。
嗨我正在使用另一個不再在公司的人寫的perl腳本。 我嘗試啟用警告,它拋出了1000行警告......!
那里有你的問題。 腳本編寫不正確,應該重寫。
問自己這個問題:當你啟用嚴格檢查時,如果它有1000個警告,你怎么能確定它正在做正確的事情? 你如何確定它不是破壞文件,破壞數據集,弄亂你的文件系統? 有可能是故意或偶然地做所有這些事情。
我不相信運行由不再與公司合作的人編寫的錯誤填寫的腳本。 我會重寫它,並確保它正在做我需要它做的事情。
卸載模塊比簡單地刪除模塊的%INC條目更困難。 看看CPAN中的Class :: Unload 。
如果您不想重寫/修復腳本,我建議通過exec()
或其中一種來調用腳本。 雖然它不是很優雅,但它肯定會解決你的問題。
您確定需要重新加載模塊嗎? 通過使用do
,您每次都在讀取源並執行它。 如果您將其更改為require
會發生什么情況,只會讀取和評估一次來源?
另一種可能性(只是在這里大聲思考)可能與本地目錄有關嗎? 他們是從同一個地方跑。 可能第一次不會工作。
另一種選擇是使用system ('doprocessing.pl');
。 懶惰地,我們使用一些腳本來強制重新初始化許多類/變量等。並強制日志文件正確旋轉。
編輯:我剛剛重新閱讀了你的問題,看起來你並沒有這樣稱呼它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.