2011-06-27 11 views
13

私はのように、すべての私のプログラムでは、いくつかのパッケージといくつかのプラグマを使用したい:私は、例えば一つのパッケージを作る方法を方法を探して、すべてのモジュールに自分自身を繰り返したくない1つの「使用」で複数のモジュールを「使用する」方法

use 5.014; 
use warnings; 
use autodie; 
use My::ModuleA::Something; 
use ModuleB qw(Func1 Func2); 

これを達成するための方法を

use My::Common; 
say Func1("hello"); #say enabled and Func1 imported in the My::Common 

My::Common何上記のパッケージを含んでいて、私のプログラムの中だろうが唯一のでしょうか?

ザ・はpreldoc -f useを読み取り、perldoc perlmodlibはので、私は「やや」これはBEGINをどうする必要があります考えてプラス&インポートが必要ですが、絶対に方法がわかりません。


UPDATE:私はすでに基本的なことを試してみましたよ。

require - 私のprg.plプログラム。

require 'mymods.pl'; 
$var = "hello"; 
croak "$var\n"; 

mymods.plは

use strict; 
use feature 'say'; 
use Carp qw(carp croak cluck); 
1; 

がWORKSていませんが含まれています。

use My; 
$var = "hello"; 
croak "$var\n"; 

私My.pm

package My; 
use strict; 
use feature 'say'; 
use Carp qw(carp croak cluck); 
1; 

いずれかWORKSません。 "私が使う" と

$ perl prg.pl 
String found where operator expected at prg.pl line 3, near "croak "$var\n"" 
    (Do you need to predeclare croak?) 
syntax error at prg.pl line 3, near "croak "$var\n"" 
Execution of prg.pl aborted due to compilation errors. 

:エラーが発生しました。同じエラーが発生しました。


どれでも作業のアイデア?

答えて

8

私はこれでいいと思う:私が間違っている場合

package My::Common; 
use 5.14.0; 
use strict; 
use warnings; 
use autodie; 
use Carp qw(carp croak cluck); 

sub import { 
    my $caller = caller; 
    feature->import(':5.14'); 
    # feature->import('say'); 
    strict->import; 
    warnings->import; 
    ## autodie->import; # <-- Won't affect the caller side - see my edit. 
    { 
     no strict 'refs'; 
     for my $method (qw/carp croak cluck/) { 
      *{"$caller\::$method"} = __PACKAGE__->can($method); 
     } 
    } 
} 

1; 

が私を修正してください、またはより良い方法があります。


EDIT

申し訳ありませんが、私はこの1つは動作するはずです... autodie->importを使用して

間違っていたが、それはあなたが常にmainパッケージからMy::Commonを呼び出すことを前提としています

package My::Common; 
# ... 
sub import { 
    # ... 
    strict->import; 
    warnings->import; 
    { 
     package main; 
     autodie->import; 
    } 
    # ... 
} 

もちろん、を追加する方がはるかに安全で簡単です各スクリプトへ:あなたはあなたの「共通」モジュールのimportメソッドをオーバーライドする場合

use My::Common; 
use autodie; 
# ... 
+0

はい!これは機能します。 ;)Thanx。 – kobame

+0

@kobame:ああ待って、私はちょうど 'autodie-> import' didn 'を見つけました。 – yibe

+2

CPANの先行技術について言及してみませんか?[Toolkit](http://p3rl.org/Toolkit)、[ToolSet](http:// p3rl .org/ToolSet)、[rig](http://p3rl.org/rig)、[perl5i](http://p3rl.org/perl5i)、[perl5](http://p3rl.org/perl5) – daxim

8

それは、実際にはかなり簡単です。プラグマのエクスポートの例については、クロマティックのModern::Perlモジュールのソースを参照してください。

他のモジュールで定義されているものを再エクスポートするには、$export_to_level(詳細は説明していませんが、Exporterドキュメントを参照してください)を実行する必要があります。 。もう1つのオプションはPollute::persistentですが、私はそれを使用していませんが、それを使用している人は誰も知らず、どれくらい安定していると言えるのでしょうか。しかし、それがうまくいくなら、おそらく最も簡単で簡単なオプションです。

3

CPANにrigというモジュールがあることに気付きました。やってみて。

+0

fyi、ここにはhttp://search.cpan.org/~rodrigo/rig-0.03/ – Baggio

+0

があります。 – kobame

関連する問題