4

我们正在从 Perl 项目中提取通用代码。一个主程序应该分成几个可重用的模块。

我们的程序名称是validate_results.pl其中包含一组验证命令。我们计划将其拆分为小模块,validate_results.pl如下所示:

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

根据我的理解,我应该创建一个 Common 文件夹,并且Validate_Results.pm应该在该文件夹下。再次在 下CommonValidate_Results应创建文件夹,在该CommonCommands文件ReturnCodeValidation夹下应存在文件夹。

是否必须存在所有这些文件夹,或者我们可以将所有 Perl 程序放在一个文件夹中并对它们进行逻辑分组,并且仍然使用上述方式访问模块(比如这样使用common::validate_results)。

4

4 回答 4

6

文件系统层次结构是必需的。A::B::C 将始终位于 A/B/C.pm 中,在 @INC 中的某个位置。

如果您必须解决这个问题,请阅读perldoc -f require,特别是在 @INC 中查找有关子例程引用的部分。是的,如果这是你真正想要的,你可以让模块加载器做一些奇怪的事情;但这不是你想要的,相信我。只要遵守约定,就像其他 99.9999999% 的 Perl 应用程序一样。

于 2009-01-22T12:18:40.593 回答
3

如果你想“使用”你的模块,那么你必须符合结构。如果您想解决这个问题,您可以“要求”您的模块,将文件名传递给要求。

不过,你真的不应该这样做。如果您真的不想拥有目录结构,请将其从模块名称中删除(尽管如果您的模块名称与 CPAN 中更通用的名称冲突,这可能会导致将来出现问题)。只需通过 Find::Bin 将脚本目录添加到 INC 路径并直接使用模块:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

高温高压

于 2009-01-22T12:27:24.570 回答
2

这是一个模块的示例,它是同一文件中的子模块:

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;

在您的程序中,如果您使用模块Foo(带有 .pm 文件的模块):

use Foo;

您将可以访问Foo::Bar函数,但只能作为规范名称 (Foo::Bar::from_foo_bar)。您可以像这样导入它们:

use Foo;
Foo::Bar->import;

请注意,您不能这样做:

use Foo::Bar;

因为没有文件Foo/Bar.pm

于 2009-01-22T14:27:12.283 回答
0

“使用”命令中的包名实际上只是一个以 .pm 文件结尾的路径,因此您不需要包含每个包名的文件夹。在您的示例中,您需要文件夹:

Common
Common/Validate_Results

但是您不需要文件夹:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

.pm 文件中的实际包名称不必与加载它的“使用”命令中的名称相同。但是保持路径与包名一致总是一个好主意。

于 2009-01-27T03:55:42.937 回答