声明 BLOCK 或编译单元的剩余部分属于给定的命名空间。package 声明的作用域是提供的代码 BLOCK,或者在没有 BLOCK 的情况下,从声明本身到当前作用域的末尾(包含的块、文件或 eval
)。也就是说,没有 BLOCK 的形式在当前作用域结束之前有效,就像 my
、state
和 our
操作符一样。此作用域中所有未限定的动态标识符都将位于给定的命名空间中,除非被另一个 package
声明覆盖,或者它们是限定到 main::
的特殊标识符之一,例如 STDOUT
、ARGV
、ENV
和标点符号变量。
package 语句只影响动态变量,包括你使用 local
的变量,但不影响词法作用域变量,词法作用域变量是用 my
、state
或 our
创建的。通常,它将是 require
或 use
包含的文件中的第一个声明。你可以多次切换到一个包,因为这只会决定编译器在该块的剩余部分中使用哪个默认符号表。你可以通过在标识符前面加上包名和双冒号来引用其他包中的标识符,例如 $SomePack::var
或 ThatPack::INPUT_HANDLE
。如果省略包名,则假定为 main
包。也就是说,$::sail
等效于 $main::sail
(以及 $main'sail
,这在旧代码中仍然可见,主要来自 Perl 4)。
如果提供了 VERSION,package
会将给定命名空间中的 $VERSION
变量设置为一个包含提供的 VERSION 的 版本 对象。VERSION 必须是 版本 模块定义的“严格”风格的版本号:一个正的十进制数(整数或小数分数),不包含指数,或者是一个带前导 'v' 字符且至少包含三个组件的点分十进制 v 字符串。您应该为每个包只设置一次 $VERSION
。
有关包、模块和类的更多信息,请参阅 "perlmod 中的包"。有关其他作用域问题,请参阅 perlsub。