在 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核心技术探索网络命名空间和网络隔离