Редактировать: Извините, если я излагаю очевидное, но я просто перечитал вопрос.Когда вы говорите
Файл, который нужно открыть, представляет собой текстовый файл, закодированный в gb18030.
Вы имеете в виду простой текстовый файл?
Если да, то ядумаю это твоя проблема.dbmopen
- для индексированного файла базы данных, идеально созданного dbmopen
в предыдущем запуске вашей perl-программы.Для простых текстовых файлов вы не можете привязать их к хешам.
Мой предыдущий резонанс ...
У меня работает в Windows с Strawberry perl 5.12.1, работающим в Windows7x64.Какой Windows Perl вы используете?Убедитесь, что в вашей установке есть хотя бы один из модулей DBM.
Некоторые другие пункты, которые могут помочь:
- Вы должны включить
$!
в свой оператор die, это будетдать вам сообщение об ошибке при неудачном открытии.Поэтому, надеюсь, ответим на ваш вопрос. dbmopen
очистит содержимое хэша %freq
, поэтому вы потеряете $freq{total}
(поскольку его 0 вы можете не заметить).Обычный шаблон: dbmopen
, измените некоторые значения хеш-функции, dbmclose
Правки:
$!
- это переменная, которая содержит проверку ошибок любой отказавшей "системы"вызов.Таким образом, ваша открытая строка должна выглядеть примерно так:
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile: $!";
Чтобы проверить стандартные модули DBM, вы можете запустить следующее из командной строки
for %m in ( DB_File GDBM_File SDBM_File NDBM_File ODBM_File ) do @perl -M%m -e "print qq(%m: $%m::VERSION\n)"
Для меня это дает:
DB_File: 1.82
GDBM_File: 1.10
SDBM_File: 1.06
Can't locate NDBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.
Can't locate ODBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.
Что фактически означает, что у меня есть DB_File, GDBM_File и SDBM_File.Но не NDBM_File или ODBM_File.Извините, я не знаю, как узнать, какой модуль dbmopen
использует по умолчанию.
Лично я всегда use
конкретный модуль и затем использую оператор tie
вместо dbmopen.