【问题标题】:Isolate namespaces in Perl script在 Perl 脚本中隔离命名空间
【发布时间】: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; 头在里面" 嗯,有错误。

标签: perl namespaces require perl-module


【解决方案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 是我不拥有的遗留代码。
猜你喜欢
  • 2017-09-23
  • 2015-03-09
  • 2019-08-24
  • 1970-01-01
  • 2021-07-16
  • 2018-09-18
  • 2011-09-15
  • 2013-07-18
相关资源
最近更新 更多