我正在查看一些Perl代码库,并对在某些文件中使用package
感到困惑。
我们有一个包含一些有用函数functions.pl
的文件,其大致如下所示:
package functions;
use strict;
sub function_a {
# code here
}
sub function_b {
# code here
}
package main;
sub function_c {
my ($arguments, $for, $this, $function) = @_;
package functions;
# Actual function code here.
}
(显然,功能和包名称发生了变化。)
此文件中的函数在require 'functions.pl'
之后的其他脚本中使用,然后调用&function_c()
- 因为调用function_c
的脚本不声明包,可能是它们在main
名称空间,因此在调用它时不必为function_c
添加任何内容。
function_a
和function_b
不在此文件之外使用,因此可能将function_c
的主体保留在非主命名空间中意味着其中的代码没有将functions::
添加到任何对它们的调用中。
有谁知道为什么有人可能会以这种方式编写要求的脚本,而不是将其编写为模块并明确导入某些函数?
我知道在Perl中有多种方法可以做到这一点,但是package
真的应该在一个文件中切换,只要你觉得这样吗?
答案 0 :(得分:3)
从技术上讲,代码没有任何问题。 package
声明确实可以用来“切换”当前的包。
那就是说,它肯定不是标准或通常推荐的方式来做到这一点;正如您所注意到的那样,那就是将脚本转换为module并将(可选)export公共函数转换为使用模块的命名空间。
多个package
声明的一个实际用途是在OO代码中,您可能希望在一个文件中定义多个类,例如:像这样:
package MyClass;
# ... MyClass methods here ...
package MyClass::Helper {
# ... helper class methods here ...
}
# ... more MyClass methods here ...
或旧的Perl版本(< 5.14):
package MyClass;
# ... MyClass methods here ...
{
package MyClass::Helper;
# ... helper class methods here ...
}
# ... more MyClass methods here ...
答案 1 :(得分:2)
原因之一可能是该脚本最初设计用于根据某些用户输入或某些条件从不同的文件集导入函数(例如:function.pl; function1.pl; function2.pl)。
这将需要在运行时导入函数,因此'require $ function'其中$ function可以是function.pl或function1.pl
其他原因可能是那个人当时不知道模块;)