2009-04-09 4 views
3

私はPerl Best Practicesの一部に従うことを容​​易にするため、ブック全体で使用されているスカラのいくつかをエクスポートするモジュールConstantsを作成します。特に、$EMPTY_STRINGというものは、私が書いたほぼすべてのPerlスクリプトで使うことができます。私が望むのは、これらのスカラーを自動的にエクスポートして、各スクリプトで明示的に定義することなく使用できるようにすることです。mod_perlでReadonly変数をエクスポートするにはどうしたらいいですか?

#!perl 
package Example::Constants; 

use Exporter qw(import); 
use Readonly; 

Readonly my $EMPTY_STRING => q{}; 
our @EXPORT = qw($EMPTY_STRING); 

使用例:

Readonly our $EMPTY_STRING => q{}; # 'our' instead of 'my' 

エラー:私はReadonly宣言を変更した場合

Global symbol "$EMPTY_STRING" requires explicit package name 

#!perl 
use Example::Constants; 
print $EMPTY_STRING . 'foo' . $EMPTY_STRING; 

上記のコードを使用して、エラーを生成し次のようになります。

Attempt to reassign a readonly scalar 

これはmod_perlでは不可能ですか?

答えて

2

あなたは4つの問題がありました。(それはあなたのため@ISAを設定しますので)baseプラグマを通じて輸出を含めることだけ

  • 優れているあなたはstrictwarningsプラグマ
  • 含めていなかった

    1. をパッケージ変数(our変数)をエクスポートすることができます
    2. モジュールは真値で終了する必要があります

    ここに修正モジュールがあります。

    package Example::Constants; 
    
    use strict; 
    use warnings; 
    use base 'Exporter'; 
    use Readonly; 
    
    Readonly our $EMPTY_STRING => q{}; 
    our @EXPORT = qw($EMPTY_STRING); 
    
    1; 
    

    うーん、私はモジュールが複数回読み込まなっているように聞こえる、読み取り専用に割り当てるしようとしてについて少しを逃しました。 mod_perlには、スクリプト自体とは別にモジュールをロードするためのmechanismがあると思います。このロードは一度だけ行われるため、使用する必要があります。

  • +0

    私はすでに1、3をやっています4、簡潔さのために例文から除外しました。また、輸出者qw(輸入)を使用するのが好ましい方法で、qw(輸出)ベースは使用しません。モジュールをPerlRequireに追加すると、開始された各HTTPプロセスに1つのエラーが生成されます。 – cowgod

    +0

    PerlModuleはどうですか? –

    +0

    また、「use Example :: Constants;」を削除しましたか?あなたのスクリプトから? –

    0

    私はテストに便利なmod_perlインスタンスを持っていないので、これらの提案をテストすることはできません。私は彼らが戸惑うことを望む。

    Scalar::Util::readonlyを使用して、変数がすでに読み取り専用に設定されているかどうかを確認してください。

    #!perl 
    package Example::Constants; 
    
    use Exporter qw(import); 
    use Readonly; 
    use Scalar::Util qw(readonly); 
    
    our $EMPTY_STRING; 
    our @EXPORT = qw($EMPTY_STRING); 
    
    if (!readonly($EMPTY_STRING)) { 
        Readonly $EMPTY_STRING => q{}; 
    } 
    

    またuse vars試みることができる:(技術の大きな制限するので、型グロブ定数は完璧なようだ使用

    #!perl 
    package Example::Constants; 
    
    use Exporter qw(import); 
    use Readonly; 
    
    our $EMPTY_STRING; 
    *EMPTY_STRING = \q{}; 
    our @EXPORT = qw($EMPTY_STRING); 
    

    #!perl 
    package Example::Constants; 
    
    use Exporter qw(import); 
    use Readonly; 
    use vars qw($EMPTY_STRING); 
    
    Readonly $EMPTY_STRING => q{}; 
    our @EXPORT = qw($EMPTY_STRING); 
    

    また、型グロブの定数を使用することができますそれはグローバルなパッケージが必要です)ここで問題ではありません。

    3

    私はReadonlyモジュールの著者です。 Readonlyの次のバージョンは、特にこの問題のために、mod_perlのサポートを提供します。

    私は、これは今をあなたの問題を解決していませんが、...よく、私は:-)

    それに取り組んでいます知っている - エリック

    +0

    うわー、あなたはこれを言うにサインアップしましたか?私は感銘を受けて。 –

    +0

    恐ろしい!どうもありがとうございます。重要な場合は、Readonly :: XSモジュールも使用しています。 – cowgod

    +3

    まあ、エリック、1年経ちました。この進歩は? :) – cowgod

    関連する問題