Perl名称空间问题:在模块中使用导出的功能不起作用

And*_* T. 4 perl

我将一些常用功能包装在一个小的Perl模块中,使用以下命令在脚本中加载

use lib path/to/lib
Run Code Online (Sandbox Code Playgroud)

在模块文件中,我导入了其他一些系统安装的模块(例如Carp qw(confess),但是我不能confess直接调用,而是调用Carp::confess,这对我来说很不常见。

这是我的(非)工作示例:https : //github.com/telatin/bioinfo/blob/master/mini/script.pl

use 5.012;
use FindBin qw($Bin);
use lib "$Bin/Demo/lib";
use Local::Module;

say "Version: ", $Local::Module::VERSION;

Local::Module->new();
Run Code Online (Sandbox Code Playgroud)

该模块:https : //github.com/telatin/bioinfo/blob/master/mini/Demo/lib/Local/Module.pm

use 5.012;
use warnings;
use Carp qw(confess);
package Local::Module;
$Local::Module::VERSION = 2;


sub new {
    my ($class, $args) = @_;
    my $self = {
        debug   => $args->{debug}, 
    };
    my $object = bless $self, $class;

    confess "Unable to create fake object";
    return $object;
}

1;
Run Code Online (Sandbox Code Playgroud)

我应该如何在.pm文件中进行操作以避免出现此问题?

mel*_*ene 8

问题在这里:

use 5.012;
use warnings;
use Carp qw(confess);
package Local::Module;
Run Code Online (Sandbox Code Playgroud)

首先,您要加载Carp并导入confess,但此时您仍处于打包状态main,因此confess已导入main

然后使用切换软件包package Local::Module,但confess此处未定义函数。

您需要先切换软件包:

package Local::Module;
use 5.012;
use warnings;
use Carp qw(confess);
Run Code Online (Sandbox Code Playgroud)

现在,所有导入和以下所有代码都在同一个程序包中。