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

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 加上 require&import 来做到这一点,但绝对不知道如何。

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

使用 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;

不工作。有错误:
$ 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";

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

也不起作用。得到了同样的错误。

任何工作想法?

最佳答案

我会这样做:

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::Common 包中调用 main:
package My::Common;
# ...
sub import {
    # ...
    strict->import;
    warnings->import;
    {
        package main;
        autodie->import;
    }
    # ...
}

因此,当然,向每个脚本添加 use autodie; 更安全、更简单:
use My::Common;
use autodie;
# ...

关于perl - 如何用一个 "use" "use"多个模块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6491058/

10-15 19:38