我们是从我们的Perl项目分解出公共代码。一个主程序应分成几个可重复使用的模块。

我们的程序名是validate_results.pl其中包含集验证命令。我们计划此分裂成小模块,使得validate_results.pl应该是这样的:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

按我理解我应该创建一个普通的文件夹和Validate_Results.pm下应当存在。再次下CommonValidate_Results文件夹应被创建并根据该CommonCommandsReturnCodeValidation文件夹应当存在。

这是必须通过所有这些文件夹应当存在,或者我们可以具有在一个单一的文件夹中的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文件中的实际的包名不必是相同的在加载它的“使用”命令的名字。但保持与包名一致的路径始终是一个好主意。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top