我想在我的所有程序中使用一些包和一些编译指示,例如:
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 use
和perldoc 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";
my My.pm
package My;
use strict;
use feature 'say';
use Carp qw(carp croak cluck);
1;
也不起作用。得到了同样的错误。
任何有用的想法?
答案 0 :(得分: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::Common
包中致电main
:
package My::Common;
# ...
sub import {
# ...
strict->import;
warnings->import;
{
package main;
autodie->import;
}
# ...
}
因此,当然,为每个脚本添加use autodie;
会更安全,更简单:
use My::Common;
use autodie;
# ...
答案 1 :(得分:8)
如果你覆盖“常用”模块的import
方法,它实际上相当简单。有关导出编译指示的示例,请参阅chromatic的Modern::Perl模块的源。
对于重新导出其他模块中定义的内容,我似乎记得$export_to_level
(请参阅Exporter文档,尽管没有明确解释)应该这样做,尽管我不能现在找到任何好的例子。另一种选择是Pollute::persistent,虽然我还没有使用它,但不知道是谁用过它,也不能说它有多稳定/坚固。但是,如果它有效,它可能是最快捷,最简单的选择。
答案 2 :(得分:3)
我刚刚注意到CPAN中名为rig的模块。尝试一下。