我是一个正在开发模块的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;
我遇到的问题是在各个文件中看到变量。我试图使用'our'声明它们,但是我必须使用我不想做的范围解析运算符。我想将它们视为模块文件中的局部变量,但将它们隐藏到调用脚本中。我还想在调用脚本中只有一个include,比如
#!/usr/bin/env perl
#script.pl
use strict;
use warnings;
use ABC;
func1();
func2();
由于
答案 0 :(得分:4)
我遇到的问题是在各个文件中看到变量。
你最好的选择是不要那样做。
词法变量的全部意义在于它们只能在一小部分本地可见的代码中访问。需要从多个不同文件访问的变量是"代码异味"。
的标志。如果你真的确定你想要这个......
我尝试使用'我们的'来宣布它们,但之后我必须使用我不想做的范围解析运算符。
是的,这应该有效,但你需要在你使用它的每个文件的顶部声明变量。
# 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;
答案 1 :(得分:3)
您可以将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的优势,可以让你搞砸一切。但这并不意味着你必须这样做。这是你应该接受的选择。