2016-12-07 7 views
2

У меня есть модуль perl, который я написал, который использует функцию encode_base64 из MIME :: Base64. По какой-то причине encode_base64 не экспортируется в пространство имен моего модуля.Perl sub не экспортируется в модуль

Возможно, у меня что-то не хватает, но я надеюсь, что кто-то сможет объяснить, что это такое.

Вот мой модуль:

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"; 

Это заставляет меня думать, что это имеет какое-то отношение к тому, как модули подключаются к другим модулям, но я не знаю. Может кто-нибудь пролить некоторый свет на это?

+0

Что происходит, когда вы помещаете 'use MIME :: Base64;' после 'package b64_test;'? – Zaid

ответ

6

Положить package b64_test; в верхней части модуля.

Оператор пакета объявляет блок компиляции как находящийся в данном пространстве имен. Объем объявления пакета из самой декларации через конец охватывающего блока, eval или файла, в зависимости от того, что наступит раньше.

В вашем случае у вас есть модуль use d и определил пакет, который создал другое пространство имен. Поэтому скрипт не может найти метод.


Модуль: b64_test.pm

[email protected]:~$ 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

[email protected]:~$ cat test.pl 

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

my $str = "Test"; 

enc($str); 

Выход:

[email protected]:~$ perl test.pl 
VGVzdA== 
+1

Молодцы, но вы должны объяснить * почему * это работает :) – Zaid

+0

@ Забыл: Готово. Не стесняйтесь редактировать хотя :) –

+0

Большое вам спасибо. Это имеет смысл. Я знал, что должен делать что-то неправильно. – bvallerand