Итак ... предложение вынести общий код в другой модуль
хороший. Но вы не должны называть модули * .pl, и вы не должны
загрузите их, указав require
по определенному пути (как в require
"../lib/foo.pl";
). (Во-первых, сказать «..» делает ваш сценарий
зависит от того, выполняются ли они из одного и того же рабочего каталога каждый раз.
Таким образом, ваш скрипт может работать, когда вы запускаете его как perl foo.pl
, но он не будет
работать, когда вы запускаете его как perl YourApp/foo.pl
. Это вообще не хорошо.)
Допустим, ваше приложение называется YourApp. Вы должны построить свой
приложение в виде набора модулей, которые находятся в каталоге lib/
. За
например, вот модуль "Foo"; его имя файла lib/YourApp/Foo.pm
.
package YourApp::Foo;
use strict;
sub do_something {
# code goes here
}
Теперь, допустим, у вас есть модуль с именем "Bar", который зависит от "Foo".
Вы просто делаете lib/YourApp/Bar.pm
и говорите:
package YourApp::Bar;
use strict;
use YourApp::Foo;
sub do_something_else {
return YourApp::Foo::do_something() + 1;
}
(В качестве расширенного упражнения вы можете использовать Sub::Exporter
или Exporter
для
make use YourApp::Foo
установить подпрограммы в пакетах потребителя
пространство имен, так что вам не нужно писать YourApp::Foo::
перед тем
все.)
Во всяком случае, вы создаете все свое приложение, как это. Логические кусочки
функционально должны быть сгруппированы в модули (или даже лучше,
классы).
Чтобы все это запустить, вы пишете небольшой скрипт, который выглядит следующим образом (я
поместите их в bin/
, поэтому назовем это bin/yourapp.pl
):
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10';
use FindBin qw($Bin);
use lib "$Bin/../lib";
use YourApp;
YourApp::run(@ARGV);
Ключевым моментом здесь является то, что ни один из вашего кода не находится за пределами модулей, кроме
чуть-чуть шаблон, чтобы запустить ваше приложение. Это легко
поддерживать, и что более важно, это позволяет легко писать автоматизированные
тесты. Вместо запуска чего-либо из командной строки, вы можете
просто вызовите функцию с некоторыми значениями.
Во всяком случае, сейчас это, вероятно, не по теме. Но я думаю, что это важно
знать.