У меня есть скрипт, который использует хеш, который содержит четыре строки в качестве ключей, значения которых являются хешами. Эти хэши также содержат четыре строки в качестве ключей, которые также имеют хэши в качестве значений. Этот шаблон продолжается до n-1 уровней, который определяется во время выполнения. Хэши n-го уровня содержат целочисленные (в отличие от обычной хеш-ссылки) значения.
Я установил модуль BerkeleyDB для Perl, чтобы я мог использовать место на диске вместо оперативной памяти для хранения этого хэша. Я предполагал, что смогу просто привязать хеш к базе данных, и это сработает, поэтому я добавил в свой код следующее:
my %tags = () ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
Однако я получаю сообщение об ошибке:
Невозможно использовать строку ("HASH (0x1a69ad8)") в качестве ссылки HASH, в то время как "строгие ссылки" используются в getUniqSubTreeBDB.pl, строка 31, строка 1.
Для тестирования я создал новый скрипт с кодом (выше), который привязан к хешу к файлу. Затем я добавил следующее:
my $href = \%tags;
$tags{'C'} = {} ;
И все прошло нормально. Затем я добавил:
$tags{'C'}->{'G'} = {} ;
И это даст примерно ту же ошибку. Я думаю, что BerkeleyDB не может обработать тип структуры данных, которую я создаю. Может быть, он смог обработать первый уровень (C -> {}) в моем тесте, потому что это был просто обычный ключ -> Scaler?
В любом случае, любые предложения или подтверждения моей гипотезы будут оценены.