2011-06-27 27 views
13

我想用一些軟件包和一些雜注在我所有的程序,如:如何「使用」一個「使用」多個模塊?

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

我不想重複自己每一個模塊中,因此尋找一種方式,如何使一個包如My::Common什麼將包含以上套餐,並在我的節目只做:

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

如何實現這一目標?

被讀爲preldoc -f useperldoc perlmodlib所以我認爲我必須「有點」這樣做與BEGIN加需要&導入,但絕對不知道如何。


更新:我已經嘗試了基本的東西。

With 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。遇到錯誤:

$ 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. 

與 「用我的」:

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

我My.pm

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

不在線,無論是。得到了同樣的錯誤。


任何工作理念?

回答

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; 

請糾正我,如果我錯了,或者有更好的辦法。


編輯

對不起,我錯在使用autodie->import ...

這應該工作,但它假定您隨時撥打My::Commonmain包:

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

因此,當然,添加更安全更簡單給每個腳本:

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

是的!這工作。 ;)Thanx。因此,需要調用導入,並且對於導出的函數,需要使用* {「$ caller ....}進行黑暗的VooDoo :)。 – 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

它實際上是相當簡單的,如果重寫你的「常用」模塊的import方法。有關導出雜注的示例,請參閱色彩的Modern::Perl模塊的來源。

對於再導出其他模塊中定義的東西,我似乎記得$export_to_level(請參閱Exporter文檔,雖然沒有明確解釋)應該這樣做,儘管目前我找不到任何好的示例。另一種選擇是Pollute::persistent,雖然我沒有使用它,不知道其他人誰使用它,並不能說它有多穩定/穩定。不過,如果它有效,它可能是最快最簡單的選擇。

3

我剛剛注意到CPAN中有一個名爲rig的模塊。試試看。

+0

fyi,它在這裏:http://search.cpan.org/~rodrigo/rig-0.03/ – Baggio

+0

好點。 – kobame

相關問題