2012-05-23 92 views
3

可能是一個奇怪的問題,但忍受我( - : 當Perl加載模塊使用'使用',這是一個編譯時指令,並假設這個模塊不使用'要求'在這個模塊的任何地方,我可以啓動一個'使用'該模塊的腳本,並且腳本廢棄時從硬盤擦除模塊並確保模塊全部加載到內存中(可以調用其所有方法等。 ..)Perl和編譯時模塊加載

感謝,

+0

你能舉出反映你的問題的例子嗎? – tuxuday

+1

這可能適用於簡單的模塊,但更復雜的可以根據需要加載子模塊或從__DATA__文件句柄中讀取(儘管Linux/Unix在打開和Windows,IIRC時不會真正刪除該文件,刪除開放文件是不允許的)。 – salva

回答

2

是的,可以。Perl的運行它之前編譯來源爲內部數據結構(parse tree),並且它不會在運行時.pm的文件。因此,移除磁盤模塊是安全的這個腳本已經編譯併成功發佈。

+1

「Perl將源代碼編譯成字節碼」並不嚴格。 Perl將模塊編譯成一系列內部數據結構,它們不以任何方式與字節代碼相似。有(或者說,我不確定它的當前狀態)是一個字節碼生成器,用於將內部結構序列化/反序列化爲字節碼,但它很少使用。 – salva

+0

我已更新答案 - 謝謝:-) – nab

1

這將適用於啓動時完全加載的簡單模塊。但請注意,許多模塊使用AUTOLOAD功能推遲加載其重型部件,直到真正需要某些特定功能。這些模塊然後可以從幾乎任何地方抽取所需的源 - 由功能文件預先分割,自己的__DATA__部分等等。自然地嘗試加載已經被刪除的文件將失敗。然而,訪問自己的__DATA__仍然可以工作(儘管我不能肯定地說它是因爲它被加載到內存中還是因爲perl持有腳本的打開句柄,從而阻止它在完成之前完全消失)。