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 № 1Rozwią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 use
d 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==