不幸的是,在Perl中创建包,导出等时,我是一个完全的菜鸟.我尝试阅读一些模块,经常发现自己从长篇章节开始打瞌睡.如果我能够在一个简单的网页中找到我需要理解的东西而不需要向下滚动,那将会很有帮助.:P
基本上我有两个模块,A和B,A将使用B中的一些函数,B将使用A中的一些函数.当我尝试编译时,我收到大量关于函数重新定义的警告perl -c
.
有没有办法正确地做到这一点?还是我的设计迟钝了?如果是这样,那会是更好的方法吗?我这样做的原因是为了避免复制n将其他模块功能再次粘贴到此模块中并重命名它们.
拥有循环依赖关系并不是一个好习惯.我建议融通东西或其他第三模块,这样你就可以有一个依赖于B,A依赖于C,B依赖于C.
所以......将公共代码分解到另一个模块的建议是一个很好的建议.但是,您不应该命名模块*.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
创建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);
这里的关键是你的代码都不在模块之外,只有一小部分样板才能启动你的应用程序运行.这很容易维护,更重要的是,它可以轻松编写自动化测试.您可以使用某些值调用函数,而不是从命令行运行某些内容.
无论如何,现在这可能是偏离主题了.但我认为重要的是要知道.