2011-11-15 7 views
2

私はCGI :: Session :: Drive :: memcachedを使用するperlスクリプトを持っていますが、システム上で利用可能であれば、デフォルトのセッションドライバまたは別のドライバにフォールバックすることができます。利用可能なモジュールに基づいてモジュールをどのように動的に組み込むのですか?

これは...私はMemcacheのを使用して始まったが、キャッシュ:: Memecachedおよび/またはCGI ::セッション::ドライバ:: memcachedは利用できない場合、このdoesntのは必ずしも例の問題を解決する方法である

package MySession; 

use Moose::Role; 
use Moose::Util::TypeConstraints; 
use namespace::autoclean; 

use CGI::Session ('-ip_match'); 
use CGI::Session::Driver::memcached; 
use Cache::Memcached::Fast; 

#would be nice to create this conditionally, or use a delegate maybe 
has 'memeCached' => (
is  => 'rw', 
isa  => 'Maybe[Cache::Memcached::Fast]', 
default => sub{ return Cache::Memcached::Fast->new({'servers' => [ '10.x.x.x.:10001' ],'compress_threshold' => '100000','nowait' => 1,'utf8' => 1}) }, 

); 


    sub buildSession{ 
    my($this,$cgi,$sessionDir) = @_; 

    $cgi = $cgi || $this->getCGI(); 

    my $sid = $this->SID();   
    my $mem = $this->memeCached(); 

    my $sss; 

    if(!$mem){ 
     $sss = CGI::Session->load(undef, $cgi, {Directory=>$sessionDir}) or die CGI::Session->errstr(); 
    }else{ 
      $sss = CGI::Session->load("driver:memcached", $cgi, { Memcached => $mem }) or die CGI::Session->errstr(); 
    } 

... 

それから、これが私の考えを得ました。私はこれをどのように一般的な意味でやっていますか?これを行う最善の方法は何ですか(特にMooseを使用する)?

答えて

3

私は同様の状況でした。私たちは、Net :: LDAPに接続できるWindowsドメインを使用します。私のプログラムでは、ユーザーID jsmithを利用できるようにしたいのですが、ユーザーIDに印刷する代わりに、John Smithという名前を印刷することができます。

私の会社の多くの人が私のプログラムを使用していますが、すべてがPerlの専門家ではなく、ほとんどの人がPerlモジュールをインストールする方法を知らないでしょう。また、Net :: LDAPは標準モジュールではないため、多くの人が標準モジュールを持っていません。

代わりに、私はフォールバックルーチンが必要でした。もし私がNet::LDAPで名前を調べることができたら、私はNet::LDAPをロードできなかった場合、その名前を印刷します。私はフォールバックしてユーザーIDを印刷します。

私はNet::LDAPがインストールされた場合、テストのために、以下を使用し、可能であればそれを読み込む:

use Foo::Bar; 

は同じです:

BEGIN { 
    eval { require Net::LDAP; }; 
    our $Net_Ldap_Status = 1 if (not [email protected]); 
} 

何を理解しなければならないことはということです

BEGIN { 
    require Foo::Bar; 
} 

モジュールにロードされますコンパイル時間。 をevalで囲むことで、ステートメントが成功するかどうか(そしてモジュールがロードされているかどうか)、失敗するかどうかをテストできます(モジュールはロードされませんが、プログラムはクラッシュしません)。モジュールがロードされたかどうか。 [email protected]は、evalが設定するエラーメッセージです。 [email protected]がヌルの場合、モジュールは存在し、正常にロードされました。

パッケージ変数(my $Net_Ldap_Statusの代わりにour $Net_Ldap_Status)を使用する必要があります。そうしないと、プログラムの実行時に変数が失われます。 (my $Net_Ldap_StatusBEGINステートメントで動作するかどうかはわかりません)。私は$Net_Ldap_Statusをチェックする必要がある場合

は今、物事はファンキー取得する場所ここに...だ

、私はそれを再宣言する必要があります。

our $Net_Ldap_Status; 

または私は変数のエラーを非宣言したことを取得する傾向があります。面白いことは、それを再宣言することによって以前の価値を失わないということです。したがって、私のコードのどこかで:

our $Net_Ldap_Status; 
if ($Net_Ldap_Status) { 
    print "Code if Net::LDAP is loaded.\n"; 
} 
else { 
    print "Fallback Code if no Net::LDAP\n"; 
} 
+0

'use Foo :: Bar;'は実際には 'BEGIN {require Foo :: Bar; import Foo :: Bar; } '。しかし、通常は条件付きでインポートすることは有用ではないので、 'import 'と呼ぶのではなく、おそらく良い考えです。 – ikegami

+0

あなたはmod_perlを使用していますか?これはなぜ私たちが価値を否定して再宣言するのかを説明するかもしれない。 anecdotalの例の+1 +1 – qodeninja

+1

@ikegami Perldocで[使用](http://perldoc.perl.org/functions/use.html)を見ると、インポートが含まれています。しかし、 'Net :: LDAP'や' CGI :: Session :: Driver :: memcached'のようなオブジェクト指向のモジュールには関数のインポートがありませんので、単純化のために残しました(プラス、私は例)。 –

関連する問題