Perl sub未导出到模块

bva*_*and 2 perl perl-module

我有一个我编写的perl模块,它使用MIME :: Base64中的encode_base64函数.出于某种原因,encode_base64未导出到我的模块的命名空间中.

我可能错过了一些东西,但我希望有人可以解释它是什么.

这是我的模块:

use strict;
use Exporter;
use MIME::Base64;

package b64_test;

BEGIN {
    our $VERSION = 1.00;
    our @ISA = qw(Exporter);
    our @EXPORT = qw(enc);
}

sub enc {
    my $msg = shift;
    my $encoded = encode_base64($msg);
    print $encoded . "\n";
}

1;
Run Code Online (Sandbox Code Playgroud)

我在我的测试脚本中使用该模块:

#!/usr/bin/env perl

use lib '..';
use b64_test;

my $str = "Test";

enc($str);
Run Code Online (Sandbox Code Playgroud)

当我调用测试脚本时,我得到了 Undefined subroutine &b64_test::encode_base64 called at b64_test.pm line 18.

为了确保我的机器没有问题,我制作了另一个使用MIME :: Base64的测试脚本,这个工作正常:

#!/usr/bin/env perl

use MIME::Base64;

my $encoded = encode_base64("TEST");
print $encoded . "\n";
Run Code Online (Sandbox Code Playgroud)

这让我相信它与模块子如何导出到其他模块有关,但我不知道.任何人都可以对此有所了解吗?

Cha*_*hak 7

解决方案:放在package b64_test;模块的顶部.

package语句将编译单元声明为在给定的命名空间中.包声明的范围是从声明本身到封闭块,eval或文件的末尾,以先到者为准.

在您的情况下,您use首先拥有d模块并定义创建另一个命名空间的包.因此脚本无法找到方法.


模块: b64_test.pm

chankeypathak@stackoverflow:~$ cat b64_test.pm

package b64_test;
use strict;
use Exporter;
use MIME::Base64;

BEGIN {
    our $VERSION = 1.00;
    our @ISA = qw(Exporter);
    our @EXPORT = qw(enc);
}

sub enc {
    my $msg = shift;
    my $encoded = encode_base64($msg);
    print $encoded . "\n";
}

1;
Run Code Online (Sandbox Code Playgroud)

测试脚本: test.pl

chankeypathak@stackoverflow:~$ cat test.pl

#!/usr/bin/env perl    
use lib '.';
use b64_test;

my $str = "Test";

enc($str);
Run Code Online (Sandbox Code Playgroud)

输出:

chankeypathak@stackoverflow:~$ perl test.pl
VGVzdA==
Run Code Online (Sandbox Code Playgroud)