Как использовать Perl dbmopen в Windows и Linux - PullRequest
0 голосов
/ 06 мая 2011

У меня есть Perl-скрипт, который отлично работает в Linux, но не работает в Windows на этом этапе:

$freq{total} = 0;
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile";

$dictfile указывает на правильное местоположение на соответствующих платформах. Изменение прав доступа к файлу 0666 не помогает. Открываемый файл - это текстовый файл, закодированный в gb18030.

Есть хитрость? Нужно ли объявлять кодировку, чтобы открыть ее в Window? Или, возможно, другой дистрибутив Perl в Windows. Я использую Strawberry Perl.

Спасибо.

1 Ответ

0 голосов
/ 06 мая 2011

Редактировать: Извините, если я излагаю очевидное, но я просто перечитал вопрос.Когда вы говорите

Файл, который нужно открыть, представляет собой текстовый файл, закодированный в 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.

...