2009-09-17 45 views
8

下面的Perl代碼..僅當我在Windows上時,我如何有條件地使用Perl模塊?

if ($^O eq "MSWin32") { 
    use Win32;                                               
    .. do windows specific stuff .. 
} 

。作品在Windows下,但不能在所有其他平臺上運行( 「無法找到Win32.pm在@INC」)。我如何指示Perl僅在Windows下運行時嘗試導入Win32,並忽略所有其他平臺下的導入語句?

回答

20

此代碼將在所有的情況下工作,並且也執行在編譯時的負荷,因爲你正在建設可能依賴於它的其他模塊:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Module; 
     Module->import(); # assuming you would not be passing arguments to "use Module" 
    } 
} 

這是因爲use Module (qw(foo bar))描述相當於BEGIN { require Module; Module->import(qw(foo bar)); }perldoc -f use

(EDIT,幾年後...)

這是更好的,但:

use if $^O eq "MSWin32", Module; 

瞭解更多關於if編譯here

+0

該死的,乙醚打我吧! – singingfish 2009-09-17 23:49:33

+0

*「Bareword」模塊「不允許,而」嚴格的潛艇「在使用中......'* - 從遠處看起來非常好...... – jww 2016-03-28 21:13:22

+0

@jww你應該用實際的模塊名稱替換」模塊「想要加載。這個名字空間需要用'package'語句在文件中聲明。 – Ether 2016-03-30 00:28:07

3

一般而言,use Moduleuse Module LIST在編譯時進行評估,無論它們出現在代碼中的哪個位置。運行時當量是

require Module; 
Module->import(LIST) 
1

require Module;

use還呼籲importrequire沒有。因此,如果模塊導出到默認名稱空間,則還應該調用

import Module qw(stuff_to_import);

您也可以eval "use Module" - 哪些工作很好如果perl可以在運行時找到正確的路徑。

+6

不要用間接方法調用,它們並不是最佳實踐由一個長鏡頭。做'Module-> import(qw(stuff));'而不是。 – Danny 2009-09-17 23:19:48

11

至於序列的快捷方式:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Win32; 
     Win32::->import(); # or ...->import(your-args); if you passed import arguments to use Win32 
    } 
} 

可以使用,如果編譯:

use if $^O eq "MSWin32", "Win32"; # or ..."Win32", your-args; 
相關問題