Eu tenho um módulo perl que escrevi que usa a função encode_base64 de MIME :: Base64. Por alguma razão, encode_base64 não está sendo exportado para o espaço de nome do meu módulo.
Provavelmente estou perdendo alguma coisa, mas espero que alguém possa explicar o que é.
Aqui está meu módulo:
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;
Estou usando esse módulo no meu script de teste aqui:
#!/usr/bin/env perl
use lib "..";
use b64_test;
my $str = "Test";
enc($str);
Quando ligo o script de teste, recebo Undefined subroutine &b64_test::encode_base64 called at b64_test.pm line 18.
Para garantir que não houvesse algo errado com minha máquina, criei outro script de teste que usa MIME :: Base64 e este funciona bem:
#!/usr/bin/env perl
use MIME::Base64;
my $encoded = encode_base64("TEST");
print $encoded . "n";
Isso me leva a acreditar que tem algo a ver com a forma como os subs de módulos são exportados para outros módulos, mas eu não sei. Alguém pode lançar alguma luz sobre isso?
Respostas:
6 para resposta № 1Solução: Colocar package b64_test;
no topo do módulo.
A declaração do pacote declara a compilaçãounidade como estando no espaço de nome fornecido. O escopo da declaração do pacote é da própria declaração até o final do bloco, avaliação ou arquivo anexo, o que ocorrer primeiro.
No seu caso você tem use
d primeiro e definiu o pacote que criou outro espaço para nome. Portanto, o script não consegue encontrar o método.
Módulo: 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;
Script de teste: test.pl
chankeypathak@stackoverflow:~$ cat test.pl
#!/usr/bin/env perl
use lib ".";
use b64_test;
my $str = "Test";
enc($str);
Saída:
chankeypathak@stackoverflow:~$ perl test.pl
VGVzdA==