2011-03-15 40 views
13

我知道我可以在Perl中有條件地使用一個模塊,但「編譯指示」又如何呢?我的測試顯示use bigint可能比Perl中的普通數學運算慢得多,我只需要它來處理64位整數,所以我只想在Perl不是用64位整數支持構建時使用它,我也知道如何檢查使用Config模塊。是否有條件地在Perl中使用bigint?

我試過evalBEGIN塊的各種東西,但無法找到有條件使用bigint的方法。我知道我可以使用Math::BigInt,但是我不能爲bigint和64位情況使用單個代碼路徑。

回答

15

其實,這只是正常:

use Config; 
BEGIN { 
    if (! $Config{use64bitint}) { 
    require bigint; 
    bigint->import; 
    } 
} 

不同的編譯時間之間的相互作用是複雜的(也許我會回來稍後嘗試解釋),但我只想說的是,由於沒有字符串eval在這裏,bigint設置的標誌將持續存在於您將該BEGIN塊放入其中的文件或塊的其餘部分。

+0

這很瘋狂,但我沒有嘗試這個,因爲我認爲'bigint'與像'Math :: BigInt'這樣的模塊有着根本的不同!具體來說,我不認爲我可以用' - > import'來使用它。謝謝你證明我錯了! – hippietrail 2011-03-16 04:09:49

+0

@hippietrail pragmas在導入例程中做了奇怪的事情 - 但它們仍然有導入例程:) – hobbs 2011-03-16 04:50:11

13

你可以把霍布斯的答案貼在模塊中。

package int64; 

use Config; 

sub import { 
    if (! $Config{use64bitint}) { 
     require bigint; 
     bigint->import; 
    } 
} 

1; 

然後use int64會做你的意思。即使bigint是詞彙,在另一個導入例程中調用它也會傳遞它的魔力。

+2

不要忘記在模塊結尾處返回1! – mkb 2011-03-15 14:14:39

+0

這是一個偉大而優雅的解決方案,但我將接受霍布斯的答案作爲規範,因爲它是第一個,其本質是相同的。 – hippietrail 2011-03-16 04:12:47

12

使用if模塊。它使用goto來隱藏它自己的堆棧框架,所以就好像該編譯指示是直接調用的。

以前給出的解決方案可能適用於bigint和大多數編譯指示,但它們將失敗,因爲import函數使用caller

+0

'if'是解決問題的好方法。 (處理進口,你可以'goto module-> can('import')') – Schwern 2011-03-15 22:07:03

+0

這真是一個好點! – tchrist 2011-03-16 01:29:34

相關問題