我正在看一些我们的Perl代码库,并对在某些文件中使用包感到困惑.
我们有一个包含一些有用函数的函数,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的脚本没有声明包,可能它们位于主命名空间中所以不要在调用它时必须在function_c之前添加任何内容.
函数_a和function_b不在此文件之外使用,因此可能将函数_c的主体保留在非主命名空间中意味着其中的代码不必将函数::前置于对它们的任何调用.
有谁知道为什么有人可能会以这种方式编写脚本,而不是将其编写为模块并明确导入某些功能?
解决方法
从技术上讲,代码没有任何问题.
package
声明确实可以用来“切换”当前的包.
也就是说,这当然不是标准或一般推荐的方式;正如您所注意到的那样,将脚本转换为module和(可选)export将公共函数转换为使用该模块的命名空间.
多包声明的一个实际用途是在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 ...