Когда дело доходит до именования пакетов, необходимо согласовать три вещи:
расположение и имя файла пакета
имя в выражение пакета в файле пакета (пространство имен)
оператор использует для пакета в коде, который его использует
Они должны "согласиться" следующим образом.
Если декларация пакета в его файле 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
), так что все перечисленные символы должны быть специально импортированы пользователем модуля.Это лучше для всех