将相同的命名函数导入到相同的命名包中

时间:2016-08-11 07:24:55

标签: perl

我试图从与不同目录中的另一个包具有相同名称的包调用函数,并且函数也是相同的名称。

说明: 让我们说package1.pm中存在dir1/ dir1/package1.pm

内部sub fun1是我想要调用的那个

package package1;

sub fun1($$$)
{
    #anything;
}

第二个包位于另一个目录中:dir2/package1.pm

package package1;

sub fun1($$$)
{
    #anything;
}

假设函数将采用相同数量的参数。

有没有办法调用我想要的功能?

2 个答案:

答案 0 :(得分:1)

我建议你根据它们所在的目录(例如Dir1::Package1Dir2::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两次。第二次覆盖第一次,这就是输出看起来的原因。