Как было предложено в previous question, одним из способов задержки загрузки модулей было бы использовать require
. Я хотел бы отложить загрузку BerkeleyDB, пока это не понадобится, вместо того, чтобы загружать ее каждый раз, когда запускается мое приложение. Было бы неплохо проверить, доступен ли BerkeleyDB. Вот моя попытка, которая, кажется, работает с любым другим модулем, я попытался (вызов сценария «load_bdb.pl»):Можно ли отложить загрузку BerkeleyDB?
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
my %hash;
eval {
require BerkeleyDB;
BerkeleyDB->import();
1;
} or do {
my $error = [email protected];
die "\nERROR: Couldn't load BerkeleyDB" if $error;
};
tie %hash, 'BerkeleyDB::Btree', -Filename => 'db_file', -Flags => DB_CREATE
or die "\nERROR: Could not open DBM file: db_file: $! $BerkeleyDB::Error\n";
Это приводит следующее сообщение об ошибке:
Bareword "DB_CREATE" not allowed while "strict subs" in use at load_bdb.pl line 18. Execution of load_bdb.pl aborted due to compilation errors.
Подавляя ошибки делает не решить эту проблему, потому что я тогда получаю:
Name "BerkeleyDB::Error" used only once: possible typo at load_bdb.pl line 20.
ERROR: Could not open DBM file: db_file: No such file or directory
Это говорит мне, что require
и import
заявления выше, не импортируя BerkeleyDB сотрудничества Правильно, тогда как это отлично работает с use
. Итак, почему require
не работает с этим конкретным модулем и есть ли другое решение?
Работает нормально. Проблема в том, что вы откладываете это, не задерживая компиляцию кода, требующего импорта. – ikegami
@ikegami Я вижу проблему сейчас, но неясно, что вы подразумеваете под «задержкой компиляции кода, требующего импорта». Не могли бы вы уточнить или что вы имеете в виду и как это будет выглядеть? – SES