/ / Perl nie jest eksportowany do modułu - perl, perl-module

Perl nie został wyeksportowany do modułu - perl, perl-module

Mam moduł perla, który napisałem, który używa funkcji encode_base64 z MIME :: Base64. Z jakiegoś powodu encode_base64 nie jest eksportowany do przestrzeni nazw mojego modułu.

Prawdopodobnie czegoś brakuje, ale mam nadzieję, że ktoś może wyjaśnić, co to jest.

Oto mój moduł:

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;

Używam tego modułu w moim skrypcie testowym tutaj:

#!/usr/bin/env perl

use lib "..";
use b64_test;

my $str = "Test";

enc($str);

Kiedy dzwonię do skryptu testowego, który otrzymuję Undefined subroutine &b64_test::encode_base64 called at b64_test.pm line 18.

Aby upewnić się, że coś nie jest nie tak z moją maszyną, zrobiłem inny skrypt testowy, który używa MIME :: Base64 i ten działa dobrze:

#!/usr/bin/env perl

use MIME::Base64;

my $encoded = encode_base64("TEST");
print $encoded . "n";

To prowadzi mnie do przekonania, że ​​ma to coś wspólnego z tym, jak moduły subs są eksportowane do innych modułów, ale nie wiem. Czy ktoś może rzucić na to trochę światła?

Odpowiedzi:

6 dla odpowiedzi № 1

Rozwiązanie: Położyć package b64_test; na górze modułu.

Instrukcja pakietu deklaruje kompilacjęjednostka jako znajdująca się w danej przestrzeni nazw. Zakres deklaracji pakietu jest od samej deklaracji do końca otaczającego bloku, eval lub pliku, w zależności od tego, co nastąpi wcześniej.

W twoim przypadku masz used moduł najpierw i zdefiniował pakiet, który stworzył inną przestrzeń nazw. Dlatego skrypt nie może znaleźć metody.


Moduł: 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;

Skrypt testowy: test.pl

chankeypathak@stackoverflow:~$ cat test.pl

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

my $str = "Test";

enc($str);

Wydajność:

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