📜  Perl模块和名称空间

📅  最后修改于: 2021-01-07 08:30:07             🧑  作者: Mango

Perl模块和名称空间

模块是一个容器,其中包含一组可以在程序中使用的变量和子例程。每个模块都有一个公共接口,一组函数和变量。

要在程序中使用模块,可以使用requireuse语句,尽管它们的语义略有不同。

'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();返回“二”。

调用没有名称空间前缀的hii()会返回当前名称空间本地的函数。第一次,我们在“ two”命名空间中。因此,它返回了“两个”。第二次,我们使用包main切换了名称空间因此,它返回“ main”。