У меня есть сценарий, использующий хеш, который содержит четыре строки в качестве ключей, значениями которых являются хэши. Эти хэши также содержат четыре строки в качестве ключей, значениями которых также являются хэши. Этот шаблон продолжается до 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->{}) в моем тесте, потому что это была обычная клавиша -> скалер?
В любом случае буду признателен за любые предположения или подтверждения моей гипотезы.