在Perl脚本中隔离命名空间

Jea*_*ean 1 perl namespaces perl-module require

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

Ste*_*ich 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
Run Code Online (Sandbox Code Playgroud)

请注意,这只是解决错误代码的一个坏方法,您最好修复代码.另请注意,您不应该调用文件/模块B.pm/B,因为已经有一个具有此名称的核心模块.

  • 如果[PHB](https://en.wikipedia.org/wiki/Pointy-haired_Boss)禁止您修改遗留代码,并且您不想将其包装在包中,则可以始终包装自己的竞争代码在一个包... (2认同)