📅  最后修改于: 2021-01-07 08:30:07             🧑  作者: Mango
模块是一个容器,其中包含一组可以在程序中使用的变量和子例程。每个模块都有一个公共接口,一组函数和变量。
要在程序中使用模块,可以使用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'关键字,但实际上它表明我们应提供该变量所在的包的名称。
看下面的代码,
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();返回“二”。
调用没有名称空间前缀的hii()会返回当前名称空间本地的函数。第一次,我们在“ two”命名空间中。因此,它返回了“两个”。第二次,我们使用包main切换了名称空间。因此,它返回“ main”。