Проблема пространства имен Perl: использование экспортированных функций в модулях не работает - PullRequest
4 голосов
/ 05 июля 2019

Я упаковываю некоторые общие функции в небольшой модуль Perl, который загружаю в скрипт, используя

use lib path/to/lib

В файле модуля я импортировал некоторые другие установленные системой модули (например, 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();

Модуль: 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;

Что мне делать в файле .pm , чтобы избежать этой проблемы?

1 Ответ

7 голосов
/ 05 июля 2019

Проблема здесь:

use 5.012;
use warnings;
use Carp qw(confess);
package Local::Module;

Сначала вы загружаете Carp и импортируете confess, но в этот момент вы все еще находитесь в пакете main, поэтому confess импортируется в main.

Затем вы переключаете пакеты с помощью package Local::Module, но здесь не определена функция confess.

Сначала вам нужно переключить пакеты:

package Local::Module;
use 5.012;
use warnings;
use Carp qw(confess);

Теперь все операции импорта и весь следующий код находятся в одном пакете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...