代码之家  ›  专栏  ›  技术社区  ›  Liju Mathew

创建包时是否必须存在包名称的文件夹?

  •  4
  • Liju Mathew  · 技术社区  · 16 年前

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

    我们的程序名是 validate_results.pl 其中包含一组验证命令。我们计划将其分为几个小模块,以便 验证结果.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 像那样)。

    4 回复  |  直到 12 年前
        1
  •  6
  •   brian d foy    16 年前

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

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

        2
  •  3
  •   Joe Casadonte    16 年前

    如果要“使用”模块,则必须符合结构。如果您想绕过这个问题,可以“需要”模块,而不是将文件名传递给require。

    不过,你真的不应该这样做。如果你真的不想有目录结构,把它从模块名中去掉(尽管如果你有一个模块名与CPAN中更通用的模块名冲突的话,将来可能会导致问题)。只需通过find::bin将scripts目录添加到inc路径,然后直接使用模块:

    use FindBin;
    use lib $FindBin::Bin;
    
    use ValidateResults;
    use CommonCommands;
    use ReturnCodeValidation;
    

    高温高压

        3
  •  2
  •   Mathieu Longtin    16 年前

    下面是一个模块的示例,它的子模块位于同一个文件中:

    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;
    

    您可以访问 酒吧:酒吧 函数,只作为规范名称(foo::bar::from_foo_bar)除外。您可以这样导入它们:

    use Foo;
    Foo::Bar->import;
    

    请注意,您不能这样做:

    use Foo::Bar;
    

    因为没有文件 福奥/ Bar.pm .

        4
  •  0
  •   noswonky    16 年前

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

    Common
    Common/Validate_Results
    

    但您不需要文件夹:

    Common/Validate_Results/CommonCommands
    Common/Validate_Results/ReturnCodeValidation
    

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