簡體   English   中英

如何強制卸載Perl模塊?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM