4

ActiveStateが提供するMSWin32-x86-マルチスレッドバイナリビルド638用にビルドされたperl、v5.6.1があります。

後で比較のために使用される定数を宣言したPerlスクリプトに取り組んでいます。何らかの理由で、定数名の行に沿った何かがスクリプトの31行目(以下のコードのuse定数句の直後の行)に無効な文字が含まれていることを示すエラーが発生します。確認したところ、定数名の「_」(アンダースコア)は正当な文字であることがわかりました。また、「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,
};

問題:

問題は、perl5.6.1によって提供される定数のバージョンがハッシュ参照をサポートしていないことです。

解決:

定数には通常の宣言を使用します。したがって、宣言は次のようになります。

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のバージョンを、定数の宣言でハッシュ参照をサポートするバージョンに更新することです。

4

6 に答える 6

13

問題は、ハッシュ参照を使用していることです。constantperl5.6.1によって提供されるバージョンはそれをサポートしていません。中かっこを削除するか、をアップグレードする必要がありますconstant

于 2009-02-03T18:39:07.107 に答える
3

perl5.8では問題なく動作しますが、perl5.6では動作しません。エラーメッセージは次のとおりです。

「HASH(0x80c05d8)」を定数として定義できません(名前に無効な文字が含まれているか、空です)

古いバージョンの問題、おそらくレオンが説明した問題のようです。

于 2009-02-03T18:41:21.440 に答える
1

読み取り専用モジュールを使用します。

定数の欠点は、定数値を返す呼び出し元の名前空間内に関数を作成することです。

読み取り専用は、スカラー、配列、およびハッシュを読み取り専用(実定数)として宣言するために使用できます。

于 2009-04-04T15:32:28.000 に答える
0

私のために働きます。そのコードのどこかに制御文字が含まれていないことを確認しますか?

于 2009-02-03T18:26:01.533 に答える
-3

この行の最後にある最後のコンマを削除します。

PCT_THRES_CUST => 3,

それが問題になる可能性があります。

于 2009-02-03T18:38:35.003 に答える