Perl库,以避免重新定义已定义的函数

时间:2011-08-18 21:50:58

标签: perl module

我有两个perl模块文件,如:

is_date_holiday.pl:

use strict;
use warnings;
sub IsDateHoliday
{
   ...
}
1

calc_prev_working_date_mult.pl:

use strict;
use warnings;
require "is_date_holiday.pl"; # IsDateHoliday
sub CalcPrevWorkingDateMult 
{
   ...
}
1

在perl文件中使用它们,如:

require "is_date_holiday.pl"; # IsDateHoliday
require "calc_prev_working_date_mult.pl" # CalcPrevWorkingDateMult

它抱怨我正在重新定义函数IsDateHoliday

如何做相当于#ifndef?

3 个答案:

答案 0 :(得分:4)

你实际上没有modules,但你应该。

IsDateHoliday.pm

package IsDateHoliday;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( IsDateHoliday );
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

sub IsDateHoliday
{
   ...
}

1;

CalcPrevWorkingDateMult.pm

package CalcPrevWorkingDateMult;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( CalcPrevWorkingDateMult );
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

use IsDateHoliday qw( :all );

sub CalcPrevWorkingDateMult
{
   ...
}

1;

main.pl

use IsDateHoliday           qw( :all );
use CalcPrevWorkingDateMult qw( :all );

答案 1 :(得分:1)

你真的要为这些创建包,然后use创建它们。这将消除重新定义的问题,因为您可以导入所需的内容,use将不会导入两次。

package IsDateHoliday;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(IsDateHoliday);

sub IsDateHoliday {
 #...
}

1; # not a typo, Perl needs modules to return true

在需要时将文件命名为“IsDateHoliday.pm”:

use strict;
use lib '.'; # to include the local directory
use IsDateHoliday;

另一种治疗相同。

当然有人可能会质疑为什么你不只是使用CPAN中的Date::Calc。 (可能没有假期,但我确定CPAN上还有其它的东西!)

答案 2 :(得分:0)

虽然最好更改为use而不是require,如果真的想要写C,它会检查它是否已经先加载在perl中,可能与您尝试做的最接近的只是设置一些变量,并检查是否存在,但您必须在eval中隐藏子例程定义。     #在包含的文件中:     我的$ DateHolidayLoaded;

if ( !$DateHolidayLoaded ) {
    eval {
        sub IsDateHoliday { ... }
        $DateHolidayLoaded = 1;
    };
}

您也可以测试函数是否存在,但您必须指定要使用的命名空间...在这种情况下,它应该是'main':

if ( ! defined( main->can( 'IsDateHoliday' ) ) ) { require 'is_date_holiday.pl' }

但这只会在包含文件的情况下起作用;如果你在带有子程序定义的文件中进行此测试,那么它将永远是真的。