在 Perl 脚本中隔离命名空间

Posted

技术标签:

【中文标题】在 Perl 脚本中隔离命名空间【英文标题】:Isolate namespaces in Perl script 【发布时间】:2016-02-12 20:27:25 【问题描述】:

我想在我的脚本A.pl 中使用在脚本B.pm(我不拥有)中定义的子例程。由于B.pm 中没有package pkg_B; 标头,因此当我在A.pl 中添加use B (); 时,将导入所有子例程。当我尝试运行A.pl 时,这会导致Subroutine redefined 警告,因为A.pl 有一个与B.pm 同名的子例程。有没有办法可以在不接触B.pm 的情况下将B.pm 的命名空间与A.pl 隔离开来(因为有许多其他脚本在没有指定范围的情况下公然使用B.pm 的子例程)?我唯一的解决方案似乎是重命名我不想这样做的子例程。

【问题讨论】:

Re "由于 B.pm 没有包 pkg_B; 头在里面" 嗯,有错误。 【参考方案1】:

...我添加use B()时所有子程序都被导入;在 A.pl

子程序没有被导入。它们在 B.pm 文件的命名空间中定义。由于该文件没有包名,因此命名空间是 main,即与 A.pl 相同的命名空间。因此,您在同一个命名空间内的名称为 name 的两个符号存在冲突。您可以做的是将 B.pm 包含在其自己的命名空间中,例如


     package Foo;
     do 'B.pm';  # defines sub foo


sub foo  ... 

foo(); # call local function
Foo::foo(); # call function from B.pm

请注意,这只是解决不良代码的一种不好的技巧,您最好修复您的代码。另请注意,您不应将文件/模块称为 B.pm/B,因为已经有一个使用此名称的核心模块。

【讨论】:

you better should fix your code 你的意思是修复B.pm @Jean:是的,在模块内使用适当的命名空间 嗯.. B.pm 是我不拥有的遗留代码。

以上是关于在 Perl 脚本中隔离命名空间的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步

Docker02:Docker核心技术探索网络命名空间和网络隔离

如何在Linux上一次删除所有网络命名空间

Tungsten Fabric与K8s集成指南丨创建隔离命名空间

Kubernetes 设置命令行的命名空间

命名空间:不只是代码封装