【问题标题】:Splitting perl module into multiple files将 perl 模块拆分为多个文件
【发布时间】:2017-08-04 19:26:40
【问题描述】:

我是一个 perl 新手,正在开发一个很长的模块,我想将它分成多个文件以便于维护和组织。现在它看起来像这样

#ABC.pm
package ABC;

use strict;
use warnings;

my $var1;
my $var2;

sub func1 {
    #some operations on a $var
}

sub func2 {
    #some operations on a $var
}

return 1;

我希望它看起来像

#ABC_Part_1.pm
package ABC;

use strict;
use warnings;

my $var1;
my $var2;

sub func1 {
    #some operations on a $var
}

return 1;

#ABC_Part_2.pm
package ABC;

use strict;
use warnings;

sub func2 {
    #some operations on a $var
}

return 1;

我遇到的问题是要在单独的文件中看到变量。我尝试使用“我们的”来声明它们,但随后我必须使用我不想使用的范围解析运算符。我想将它们视为模块文件中的局部变量,但将它们隐藏到调用脚本中。我还想在调用脚本中只包含一个,比如

#!/usr/bin/env perl
#script.pl

use strict;
use warnings;
use ABC;

func1();
func2();

谢谢

【问题讨论】:

    标签: perl module perl-module


    【解决方案1】:

    我遇到的问题是要在单独的文件中看到变量。

    你最好的选择是停止想要那个。

    词法变量的全部意义在于它们只能在一小段本地可见的代码中访问。需要从多个不同文件访问的变量是“代码异味”的标志。

    如果你真的确定你想要这个……

    我尝试使用“我们的”来声明它们,但是我必须使用我不想这样做的范围解析运算符。

    是的,这应该可以,但是您需要在您使用它的每个文件的顶部声明变量。

    # ABC_part_1.pm
    package ABC;
    our $foo;
    
    # code that accesses $foo goes here
    
    1;
    

    然后:

    # ABC_part_2.pm
    package ABC;
    our $foo;
    
    # code that accesses $foo goes here
    
    1;
    

    【讨论】:

      【解决方案2】:

      您可以使您的 ABC.pm 文件成为 require 语句的集合。

      package ABC;
      
      require ABC1;
      require ABC2;
      require ABC3;
      
      1;
      

      使用require 而不是use 很重要,因为use 会尝试自动导入内容。但这不起作用,因为您的 ABC1.pm 文件中没有 package ABC1,所以 ABC1->import 将失败。

      关于变量,实际上没有办法将词法变量放入不同的文件中。您可以使用do 代替require,这将直接在do 行中读取和运行文件。这样,范围将保持不变,并且您可以拥有它。

      package ABC;
      
      my $foo;
      my $bar;
      
      do 'lib/ABC1.pm';
      do 'lib/ABC2.pm';
      

      请不要这样做。太疯狂了!

      如果您觉得您的库变得太大,请先为每个函数添加适当的文档,然后进行排序,以便将属于一起的东西放在一起。如果这对您没有帮助,请将文件拆分为更小的逻辑单元,并使这些单独的包通过定义的接口相互通信,但也能够在需要时独立存在。

      如果重复一堆use 语句感觉太多样板,请使用Import::Into 编写您自己的模块集合(如限制)。

      此外,不要在文件范围内使用词法变量。如果您想拥有事物的状态,请创建面向对象的代码并编写类。然后你会有状态和行为。如果您有包/类数据,请使用包变量。

      Perl 没有私有事物的概念是有原因的。有一些约定可以将事物标记为私有,例如将它们命名为 _stuff 并带有前导下划线。这对每个人来说都是一个信号,它是内部的,不是一个稳定的 API,可能随时发生变化,不应该被弄乱。这样做,而不是试图隐藏事情。 Perl 的一个优点是可以让你搞砸一切。但这并不意味着您必须这样做。这是您应该接受的选择。

      【讨论】:

      • 我的回答的最重要部分是从技术上讲这是可能的。但是请不要使用它。第二部分是你应该做的。或者,如果您不喜欢这样,就照托比所说的去做。
      • @zebramints 这是很多非常好的建议,第二部分,我不知道如何足够支持它。如果我不得不说 one 的事情,我会说创建逻辑相关的 subs 的单独模块。如果这不合适,要么很好地组织和记录一个模块,要么将其设为类(或层次结构或类)。您正在尝试模块化您的模块,也就是说,跨多个文件看到的变量与之相反
      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 2017-01-02
      • 2014-05-01
      • 2021-12-06
      • 2020-01-19
      • 2011-03-11
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多