如何使用一个"使用""使用"多个模块?

kob*_*ame 13 perl

我想在我的所有程序中使用一些包和一些编译指示,例如:

use 5.014;
use warnings;
use autodie;
use My::ModuleA::Something;
use ModuleB qw(Func1 Func2);
Run Code Online (Sandbox Code Playgroud)

我不想在每个模块中重复自己,所以寻找一种方法如何制作一个包,例如My::Common包含上述包的内容以及我的程序中只包含:

use My::Common;
say Func1("hello"); #say enabled and Func1 imported in the My::Common
Run Code Online (Sandbox Code Playgroud)

怎么实现这个?

这是阅读preldoc -f use,perldoc perlmodlib所以我认为我必须"有点"用BEGIN加上需要和导入,但绝对不知道如何.


更新:我已经尝试了基本的东西.

require- 我的prg.pl程序.

require 'mymods.pl';
$var = "hello";
croak "$var\n";
Run Code Online (Sandbox Code Playgroud)

mymods.pl包含

use strict;
use feature 'say';
use Carp qw(carp croak cluck);
1;
Run Code Online (Sandbox Code Playgroud)

不工作.得到错误:

$ 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.
Run Code Online (Sandbox Code Playgroud)

用"使用我的":

use My;
$var = "hello";
croak "$var\n";
Run Code Online (Sandbox Code Playgroud)

我的朋友

package My;
use strict;
use feature 'say';
use Carp qw(carp croak cluck);
1;
Run Code Online (Sandbox Code Playgroud)

也不工作.得到了同样的错误.


任何工作的想法?

yib*_*ibe 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;
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我,或者有更好的方法.


编辑:

对不起,我用错了autodie->import......

这个应该工作,但它假设你总是My::Commonmain包调用:

package My::Common;
# ...
sub import {
    # ...
    strict->import;
    warnings->import;
    {
        package main;
        autodie->import;
    }
    # ...
}
Run Code Online (Sandbox Code Playgroud)

所以,当然,use autodie;为每个脚本添加一个更安全,更简单:

use My::Common;
use autodie;
# ...
Run Code Online (Sandbox Code Playgroud)

  • 为何没有提及CPAN的现有技术?[工具包](http://p3rl.org/Toolkit),[ToolSet](http://p3rl.org/ToolSet),[rig](http://p3rl.org/rig),[perl5i](http ://p3rl.org/perl5i),[perl5](http://p3rl.org/perl5)已经这样做了. (2认同)

Dav*_*man 8

如果你覆盖你的"通用"模块的import方法,它实际上相当简单.有关导出编译指示的示例,请参阅chromatic的Modern :: Perl模块的源代码.

对于重新导出其他模块中定义的内容,我似乎记得$export_to_level(虽然没有明确解释,但请参阅Exporter文档)应该这样做,尽管我目前找不到任何好的例子.另一种选择是Pollute :: persistent,虽然我还没有使用它,但是不知道有谁使用它,也不能说它有多稳定/坚固.但是,如果它有效,它可能是最快捷,最简单的选择.