我有两个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?
答案 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' }
但这只会在包含文件的情况下起作用;如果你在带有子程序定义的文件中进行此测试,那么它将永远是真的。