Ваше описание того, что вы хотите сделать этим "файлом конфигурации" (импорт подпрограмм и переменных в пространство имен вызывающего, переопределение подпрограмм, классов, наследование ...) звучит подозрительно, как стандартный модуль Perl.Поэтому используйте стандартный модуль Perl.
Обратите внимание, что у этого подхода есть широко распространенный прецедент: стандартный клиент командной строки cpan
сохраняет свою конфигурацию в модуле, расположенном по пути по умолчанию ~/.cpan/CPAN/MyConfig.pm
on *системы типа nix.Конечно, cpan
MyConfig.pm
- это очень простой пример, который просто устанавливает хэш-ссылку $CPAN::Config
, но нет никаких причин, по которым он не мог бы также делать все остальные вещи, которые делает любой модуль.
Но выполнениеэто с do
довольно просто.Я подозреваю, что вы просто переосмыслили это:
$ cat test-override
#!/usr/bin/perl
use warnings;
use strict;
our @tables = qw(a b c);
sub print_tables {
print join(", ", @tables), "\n";
};
print_tables;
do "test-conf";
print_tables;
print "\@tables is @tables\n";
$ cat test-conf
@tables = qw(d e f);
sub print_tables {
print "print_tables from test_conf\n";
}
$ ./test-override
a, b, c
print_tables from test_conf
@tables is d e f
Важное изменение, которое я сделал с @tables
, состояло в том, чтобы изменить его с my
, который виден только в пределах текущей области действия и текущейфайл , до our
, который виден где-либо в пределах того же пакета (или из других пакетов, если он содержит имя пакета).
Но мой print_tables
из файла конфигурации неНазовите оригинал print_tables
, и вам просто не повезло.Поскольку может быть только один &main::print_tables
, его замена полностью заменяет исходный, которого больше нет.Если вы хотите иметь возможность переопределить его и по-прежнему иметь возможность вызывать оригинал, вам нужно поместить два объявления в разные пакеты, что подразумевает использование OO Perl (так что вы сможете полиморфически вызывать правильный).
Также обратите внимание, что use
имеет ту же лексическую область действия, что и my
, что означает, что ваш use strict; use warnings;
не не переносится в файл conf.Вы можете легко продемонстрировать это, добавив use warnings;
к моей версии test-conf
, после чего он выдаст предупреждение Subroutine print_tables redefined
.