Создание Perl-модуля - неопределенная подпрограмма - PullRequest
0 голосов
/ 30 января 2019

Я новичок в Perl и пытаюсь выполнить это упражнение, но оно не работает.

Это мой модуль, который я создал.

#!/usr/bin/perl 
use warnings;
use strict;

package Prepare;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw( clean my_print );

sub clean{
return chomp($_[0]);
}

sub my_print{
return print("The Results: $_[0]\n");
}

1;

И этомой скрипт test_lib.pl

#!/usr/bin/perl
use warnings;
use strict;

use lib '/home/foobar/code';
use My::Prepare;

print "Enter a word: ";
my $input=<STDIN>;

print "You entered: $varia";

clean($input);
my_print($input);

Я получаю эту ошибку:

Undefined subroutine &main::clean called at ./test_lib.pl line 13, <STDIN> line 1.

1 Ответ

0 голосов
/ 30 января 2019

Когда дело доходит до именования пакетов, необходимо согласовать три вещи:

  • расположение и имя файла пакета

  • имя в выражение пакета в файле пакета (пространство имен)

  • оператор использует для пакета в коде, который его использует

Они должны "согласиться" следующим образом.

Если декларация пакета в его файле package My::Package;, тогда пакет должен использоваться как use My::Package, а его файл Package.pm в каталоге My.

Этот каталог My сам должен находиться в месте, которое будет искать переводчик, или нам нужно сообщить ему, где искать.Пользовательские пакеты обычно не находятся в каталогах, по которым выполняется поиск по умолчанию, для чего lib pragma предназначена для: с вашим

use lib '/home/foobar/code';

я ожидал бы каталог My с Package.pm в нем, чтобы находиться в каталоге /home/foobar/code.

Тогда вот ваш пример с фиксированными именами и с некоторыми дополнительными настройками.

Файл /home/foobar/code/My/Prepare.pm:

package My::Prepare;

use warnings;
use strict;

use Exporter qw(import);

our @EXPORT_OK = qw( clean my_print );

sub clean { return chomp $_[0] }

sub my_print { print "The Results: $_[0]\n" }

1;

И скрипт, который использует этот модуль

#!/usr/bin/perl
use warnings;
use strict;

use lib '/home/foobar/code';

use My::Prepare qw(clean my_print);

print "Enter a word: ";
my $input = <STDIN>;

print "You entered: $input";

my $cleaned_input = clean($input);
my_print($cleaned_input);

Пожалуйста, измените пути выше к вашей фактической структуре каталогов, добавляя или удаляя компоненты пути по мере необходимости.Это My:: торчит в частности.

Несколько заметок.

  • нет необходимости в строке "shebang" (#!/usr/bin/perl) в модуле

  • использование Exporter выше немного более современно

  • Я настоятельно рекомендую использовать @EXPORT_OK (вместо @EXPORT), так что все перечисленные символы должны быть специально импортированы пользователем модуля.Это лучше для всех

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...