/ / Perl sub не се експортира в модул - perl, perl-модул

Perl sub не се експортира в модул - perl, perl-module

Имам perl модул, който написах, който използва функцията encode_base64 от MIME :: 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;

Използвам този модул в моя тестов скрипт тук:

#!/usr/bin/env perl

use lib "..";
use b64_test;

my $str = "Test";

enc($str);

Когато се обадя на тестовия скрипт, получавам 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";

Това ме кара да вярвам, че има нещо общо с това как модулните модули се експортират в други модули, но не знам. Може ли някой да хвърли малко светлина върху това?

Отговори:

6 за отговор № 1

Решение: Слагам package b64_test; в горната част на модула.

Изявлението на пакета декларира компилациятаединица като в даденото пространство от имена. Обхватът на декларацията на пакета е от самата декларация до края на заграждащия блок, eval или файл, което от двете настъпи първо.

Във вашия случай имате used модул първо и дефинира пакета, който създаде друго пространство от имена. Следователно скриптът не може да намери метод.


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

Тестов скрипт: test.pl

chankeypathak@stackoverflow:~$ cat test.pl

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

my $str = "Test";

enc($str);

изход:

chankeypathak@stackoverflow:~$ perl test.pl
VGVzdA==