在Perl脚本中隔离命名空间

时间:2015-11-11 17:01:45

标签: perl namespaces require perl-module

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

1 个答案:

答案 0 :(得分:5)

  

...当我添加使用B()时导入所有子程序;在A.pl

不会导入子例程。它们在B.pm文件的命名空间中定义。由于此文件没有包名称,因此命名空间是主要的,即与A.pl相同的命名空间。因此,您在同一名称空间内存在两个带有名称名称的符号的冲突。你可以做的是在自己的命名空间中加入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,因为已经有一个具有此名称的核心模块。