Библиотека Perl, чтобы избежать переопределения уже определенной функции - PullRequest
3 голосов
/ 19 августа 2011

У меня есть два файла модуля 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 ]

4 голосов
/ 19 августа 2011

На самом деле у вас нет модулей , но вы должны.

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 голос
/ 19 августа 2011

На самом деле вы должны создать пакеты для них, а затем 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» тогда, когда вам это нужно:1006 *

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

То же самое для другого.

Конечно, можно задаться вопросом, почему вы не просто используете Date::Calc из CPAN.(Не может быть праздников, но я уверен, что что-то еще на CPAN есть!)

0 голосов
/ 19 августа 2011

Хотя было бы лучше изменить значение use на require, которое проверит, загрузилось ли оно уже первым, если вы действительно хотели написать C на Perl, вероятно самым близким к тому, что вы пытаетесь сделать, было бы просто установить некоторую переменную и проверить, существует ли, но вы должны скрыть определение подпрограммы в eval. # во включенном файле: my $ DateHolidayLoaded;

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

Вы также можете проверить наличие функции, но вы должны указать, какое пространство имен использовать ... и в этом случае это будет 'main':

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

Но это будет работать только в файле, выполняющем включение; если вы выполните этот тест в файле с определением подпрограммы, он всегда будет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...