Perl模块和命名空间

模块是一个容器, 其中包含一组可以在程序中使用的变量和子例程。每个模块都有一个公共接口, 一组函数和变量。
要在程序中使用模块, 可以使用require或use语句, 尽管它们的语义略有不同。
‘ require’ 语句在运行时加载模块, 以避免冗余加载模块。 ‘ use’ 语句就像require一样, 具有两个附加属性, 即编译时加载和自动导入。
命名空间是一组不同的标识符(变量, 函数)的容器。命名空间就像name :: variable。
每段Perl代码都在一个命名空间中。
在以下代码中,

use strict; use warnings; my $x = "Hello"; $main::x = "Bye"; print "$main::x\n"; # Bye print "$x\n"; # Hello

这是定义为x的两个不同变量。 $ main :: x是一个包变量, 而$ x是一个词法变量。通常, 我们使用用我的关键字声明的词法变量, 并使用命名空间分隔函数。
在上面的代码中, 如果我们不使用use strict, 则会收到警告消息, 因为
Name"main::x" used only once: possible typo at line..

主要是当前脚本和当前变量的命名空间。我们还没有写任何东西, 但是我们已经在’ main’ 命名空间中了。
通过添加” use strict” , 现在我们得到以下错误,
Global symbol "$x" requires explicit package name

在此错误中, 我们得到了一个新词” package” 。它表明我们在声明变量之前忘记使用’ my’ 关键字, 但实际上它表明我们应提供该变量所在的包的名称。
使用package关键字的Perl交换命名空间看下面的代码,
use strict; use warnings; use 5.010; sub hii { return "main"; } package two; sub hii { return "two"; } say main::hii(); # main say two::hii(); # two say hii(); # two package main; say main::hii(); # main say two::hii(); # two say hii(); # main

在这里, 我们使用package关键字从” main” 命名空间切换到” two” 命名空间。
用命名空间调用hii()会返回各自的命名空间。就像, 说main :: hii(); 返回’ main’ 并说两个:: hii(); 返回” 二” 。
【Perl模块和命名空间】调用没有命名空间前缀的hii()会返回当前命名空间本地的函数。第一次, 我们在” two” 命名空间中。因此, 它返回了” 两个” 。第二次, 我们使用包main切换了命名空间。因此, 它返回” main” 。

    推荐阅读