我想在脚本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
中隔离出来(因为有许多其他脚本公然消耗/
的子例程而没有指定范围)?我唯一的解决方案似乎是重命名我的子程序,我不想这样做。
答案 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,因为已经有一个具有此名称的核心模块。