个性化阅读
专注于IT技术分析

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

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

赞(0)
未经允许不得转载:srcmini » Perl模块和命名空间

评论 抢沙发

评论前必须登录!