通常在我编写perl程序时。我曾经包括以下包。
use strict ;
use warnings ;
use Data::Dumper ;
现在,我想这样,我不会为每个程序都包含所有这个包。因为那 我将在我自己的包装中包含这些所有包装。喜欢以下。
my_packages.pm
package my_packages ;
{
use strict ;
use warnings ;
use Data::Dumper;
}
1;
所以,如果我在perl程序中添加my_packages.pm,它需要拥有以上所有的包。
其实我做过这个实验。但我无法得到这些东西。 这意味着当我使用my_packages时。我无法获得“使用严格,使用警告,使用Data :: Dumper”的功能。
有人帮我解决了这个问题......
答案 0 :(得分:5)
查看ToolSet
,它会为您完成所有脏导入工作。
pod中的使用示例:
创建工具集:
# My/Tools.pm
package My::Tools;
use base 'ToolSet';
ToolSet->use_pragma( 'strict' );
ToolSet->use_pragma( 'warnings' );
ToolSet->use_pragma( qw/feature say switch/ ); # perl 5.10
# define exports from other modules
ToolSet->export(
'Carp' => undef, # get the defaults
'Scalar::Util' => 'refaddr', # or a specific list
);
# define exports from this module
our @EXPORT = qw( shout );
sub shout { print uc shift };
1; # modules must return true
使用工具集:
use My::Tools;
# strict is on
# warnings are on
# Carp and refaddr are imported
carp "We can carp!";
print refaddr [];
shout "We can shout, too!";
/ I3az /
答案 1 :(得分:3)
这比你想象的要难。
对于strict
和warnings
这样的pragma,您可以通过它们。
对于不导出面向对象等功能的模块,它可以正常工作。
但是对于默认导出的模块,比如Data :: Dumper(它在调用者的包中提供了Dumper()
函数),它更加棘手。
你可以通过告诉Exporter
有一层额外的魔法来使它成功:
所以你可以这样做:
package my_packages;
use strict;
use warnings;
use Data::Dumper;
use IO::Socket;
$Exporter::ExportLevel = 1; # Tell Exporter to export to the caller
sub import {
# Enable this in the callers package
strict->import; # pragma in caller
warnings->import; # pragma in caller
Data::Dumper->import; # Adds Dumper() to caller
# No need for IO::Socket since it's OO.
return 1;
}
1;
对于三个模块,这似乎不值得。
答案 2 :(得分:0)
见:
package Foo;
use warnings;
sub import {
warnings->import;
}
1;
现在:
$ perl <<CUT
> use Foo;
> \$a = 5; # backslash just to keep the $ from being eaten by shell
> CUT
Name "main::a" used only once: possible typo at - line 2.
取自Modern::Perl。