/ / Perl sub não exportado para um módulo - perl, perl-module

Perl sub não exportado para um módulo - perl, perl-module

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 № 1

Soluçã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 used 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==