我试图从与不同目录中的另一个包具有相同名称的包调用函数,并且函数也是相同的名称。
说明:
让我们说package1.pm
中存在dir1/
dir1/package1.pm
内部sub fun1
是我想要调用的那个
package package1;
sub fun1($$$)
{
#anything;
}
第二个包位于另一个目录中:dir2/package1.pm
package package1;
sub fun1($$$)
{
#anything;
}
假设函数将采用相同数量的参数。
有没有办法调用我想要的功能?
答案 0 :(得分:1)
我建议你根据它们所在的目录(例如Dir1::Package1
,Dir2::Package1
)来命名包。并将它们保存在同一个基础(在本例中为/ lib)目录中:
/lib--
|
---/Dir1--
| |
| --Dir1::Package1
|
|
---/Dir2--
|
-- Dir2::Package1
然后在脚本中,您可以完全限定子例程名称,以根据您的意愿从这些包中调用:
#!/usr/bin/perl
use strict;
use warnings;
use lib qw(./lib);
use Dir1::Package1;
use Dir2::Package1;
# call from Dir1 Package1
Dir1::Package1::fun();
# call from Dir2 Package1
Dir2::Package1::fun();
答案 1 :(得分:0)
我首先要说的是,我建议的方式非常不推荐,并会提出警告。
我想到的最天真的方式就是使用do
:
unshift @INC, "yourpath/dir1";
do 'package1.pm';
package1::sub1();
shift @INC;
unshift @INC,"yourpath/dir2";
do 'package1.pm';
package1::sub1();
假设sub1
打印当前目录,因此输出将如下所示:
dir1
Subroutine sub1 redefined at yourpath/dir2/package1.pm line 8.
dir2
同样,除非您不关心某些警告原因,否则不要使用它。这可能会导致很多未来的错误。
为什么会这样:
do
加载代码并且不记得它加载了它,这意味着在do
的另一个调用中使用相同名称的包,它将被覆盖。通常您不会使用do
,但require
会记住它加载了一个包。附加的代码使用do
两次。第二次覆盖第一次,这就是输出看起来的原因。