所以...将通用代码分解到另一个模块中的建议是
一个很好的。但是,您不应该将模块命名为 *.pl,也不应该
通过require-ing 某个路径名(如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);
这里的关键是你的代码都没有在模块之外,除了一个
启动您的应用程序运行的一小部分样板文件。这很容易
维护,更重要的是,它使编写自动化变得容易
测试。而不是从命令行运行某些东西,您可以
只需调用具有某些值的函数即可。
无论如何,现在这可能是题外话了。但我认为这很重要
知道。