如何将我的包导入分组到一个自定义包中?

时间:2010-03-18 06:06:26

标签: perl packages

通常在我编写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”的功能。

有人帮我解决了这个问题......

3 个答案:

答案 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)

这比你想象的要难。

  • 对于strictwarnings这样的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