2009-02-03 95 views
4

我有爲MSWin32-x86構建的perl,v5.6.1 - 多線程二進制版本638由ActiveState提供。爲什麼Perl在用constant.pm使用散列引用時會抱怨?

我正在處理一個Perl腳本,我已經聲明瞭稍後用於比較的常量。出於某種原因,我得到一個錯誤,指出沿着常量名稱行在腳本行31(在下面的代碼中使用常量子句後面的行)有無效字符。我檢查並發現常量名中的'_'(下劃線)是一個合法的字符。我也嘗試將'0.00'改爲'0',看看是否是原因,但我得到了同樣的錯誤。我不確定我做錯了什麼。任何人都知道爲什麼編譯器不喜歡這個?

謝謝!

這裏是代碼:

use constant { 
MIN_NET_DLR => 0.00, 
MAX_NET_DLR => 99.99, 
MIN_SUM_DLR => 0.00, 
MAX_SUM_DLR => 999.99, 
MIN_UNITS => 0, 
MAX_UNITS => 99, 
MIN_SUM_UNITS => 0, 
MAX_SUM_UNITS => 999, 
PCT_THRES_AO => 1, 
PCT_THRES_TRANS_CUST_BI => 20, 
PCT_THRES_CUST => 3, 
}; 

問題:

的問題是,Perl的5.6.1提供恆定的版本不支持散列引用。

SOLUTION:

使用常量的常規聲明。因此,該聲明如下所示:

use constant MIN_NET_DLR => 0.00; 
use constant MAX_NET_DLR => 99.99; 
use constant MIN_SUM_DLR => 0.00; 
use constant MAX_SUM_DLR => 999.99; 
use constant MIN_UNITS => 0; 
use constant MAX_UNITS => 99; 
use constant MIN_SUM_UNITS => 0; 
use constant MAX_SUM_UNITS => 999; 
use constant PCT_THRES_AO => 1; 
use constant PCT_THRES_TRANS_CUST_BI => 20; 
use constant PCT_THRES_CUST => 3; 

感謝@leon爲解決方案以及其他人提供了輸入內容。

更新:另一個(更優雅的)解決方案是更新您的Perl版本到支持散列引用聲明常量。

+0

如果刪除最後一個逗號,會發生什麼情況? – 2009-02-03 18:26:23

+0

哪個版本的Perl?你的代碼在Perl 5.8.8上可以正常工作。如果您的示例從第30行開始,那麼可能錯誤位於您粘貼的小部分代碼之上。 – 2009-02-03 18:26:26

+0

我只是將常量聲明部分移動到測試腳本並運行該腳本,但仍然出現錯誤。我在Windows XP中運行ActivePerl有沒有關係?如果它在爲你運行,那對我來說可能是一個環境問題。 – tundal45 2009-02-03 18:33:19

回答

13

問題是您正在使用散列引用。 perl 5.6.1提供的constant版本不支持。您必須移除大括號或升級您的constant

0

適合我。你確定你的代碼中沒有任何控制字符嗎?

-3

在此行的末尾刪除最後一個逗號:

PCT_THRES_CUST => 3, 

這可能是問題。

3

它在perl5.8上正常工作,但在perl5.6上不起作用。該錯誤信息是:

無法定義「HASH(0x80c05d8)」爲常數(名稱包含無效字符或爲空)

似乎是一箇舊版本的問題,可能問題是Leon described

3

您的舊Perl可能不支持您在一個語句中聲明多個常量的語法。嘗試像這樣分別定義每個常量...

use constant MAX_NET_DLR => 99.99; 
1

我會使用Readonly模塊。

常量的缺點是,它在調用者名稱空間內創建一個返回一個常量值的函數。

只讀可以用來聲明標量,數組和哈希只讀(實常量)。

相關問題