题
我们是从我们的Perl项目分解出公共代码。一个主程序应分成几个可重复使用的模块。
我们的程序名是validate_results.pl
其中包含集验证命令。我们计划此分裂成小模块,使得validate_results.pl
应该是这样的:
use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...
按我理解我应该创建一个普通的文件夹和Validate_Results.pm
下应当存在。再次下Common
,Validate_Results
文件夹应被创建并根据该CommonCommands
和ReturnCodeValidation
文件夹应当存在。
这是必须通过所有这些文件夹应当存在,或者我们可以具有在一个单一的文件夹中的Perl程序和逻辑组他们并且仍然使用上述方法来访问模块(比方说使用common::validate_results
那样)。
解决方案
是必需的文件系统层次结构。 A :: B ::Ç将始终位于A / B / C.pm,在@INC某处。
如果您的的的来解决这个问题,请参阅的perldoc -f需要,专门找有关@INC函数引用部分。是的,你可以使模块加载器做奇怪的事情,如果这是你真正想要的;但是这不是你想要的,相信我。只要坚持惯例,像Perl应用程序的其他99.9999999%做。
其他提示
如果你想“使用”你的模块,则必须符合结构。如果你想避开你可以“需要”你的模块来代替,传递文件名要求。
您真的不应该这样做,虽然。如果你真的不希望有一个目录结构,把它拿出来的模块名称(尽管这可能导致在未来的问题,如果你曾经有东西从CPAN更通用的冲突的模块名称)。简单地脚本目录直接添加到经由查找::滨的INC路径并使用模块:
use FindBin;
use lib $FindBin::Bin;
use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;
HTH
这里的一个模块的一个例子,它是在相同的文件子模块:
package Foo;
use strict;
use Exporter 'import';
our @EXPORT = ( 'from_foo' );
sub from_foo { print "from_foo\n"; }
package Foo::Bar;
use strict;
use Exporter 'import';
our @EXPORT = ( 'from_foo_bar' );
sub from_foo_bar { print "from_foo_bar\n"; }
1;
在你的程序中,如果你使用模块的富的(一个用的.pm文件):
use Foo;
您将有机会获得的富::酒吧的功能,但只能作为规范名称(富::酒吧:: from_foo_bar)。你可以导入这样的:
use Foo;
Foo::Bar->import;
请注意,你不能做到这一点:
use Foo::Bar;
由于没有文件的富/ Bar.pm
在“使用”命令包名称实际上是只是其中一个的.pm文件结束,所以你并不需要每包的名称的文件夹的路径。在你的榜样,你需要的文件夹:
Common
Common/Validate_Results
但你并不需要的文件夹:
Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation
在的.pm文件中的实际的包名不必是相同的在加载它的“使用”命令的名字。但保持与包名一致的路径始终是一个好主意。