Имам 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 или файл, което от двете настъпи първо.
Във вашия случай имате 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;
Тестов скрипт: 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==