Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > DBM файлы


Автор: rcdimon 27.4.2005, 11:33
Мне нужно создать сервер. Сейчас там уже установлен и настроен апач и перл. CGI сценарии работают. Но
dbmopen не работет! Вообще. Не создает никаких файлов. И не выдает никаких ошибок... Как сделать так что б они все же работали????

Автор: korob2001 27.4.2005, 12:00
Не все операционки работают с DBM файлами. Узнай установлен у тебя на сервере модуль DB_File, затем пиши сюда.

Автор: rcdimon 27.4.2005, 12:46
Не знаю. В каталоге перла есть файл DB.pm
И есть DB_File.pm в каталоге i586-linux-thread-multi

Это типа он и есть?
Добавлено @ 12:48
Вот это код, который я использую для работы с BDM файлами

Код

#!/usr/bin/perl -w

use CGI qw(:all);


##############################################################################
##        Объявление некоторых констант                    ##

    $root_path    =    "../cgi-bin";
    $docs_path    =    "../www";


##############################################################################

dbmopen(%a, "$docs_path/hash/admin_pass",0644);

print header( -charset => 'Windows-1251' );

$a{'12345'} = '12345';



Автор: Secandr 27.4.2005, 13:08
rcdimon укажи полные пути и поставь права на запись в эти папки

Автор: rcdimon 27.4.2005, 13:41
путь /usr/lib/perl5/5.8.1/

Автор: Secandr 27.4.2005, 13:46
Код

    $root_path    =    "../cgi-bin";
    $docs_path    =    "../www";

вот тут пути поставь полные и на эти же папки надо поставить права на запись.

Автор: korob2001 27.4.2005, 13:56
Попробой такой код:
Код

#!/usr/bin/perl
use strict;
use DB_File;

my $file = "mybdm";
my %dbm  = ();

tie( %dbm, 'DB_File', $file, 0644 ) or die "Can't open DBM file: $!\n";
$dbm{1} = 'Perl';
$dbm{2} = 'Delphi';
untie( %dbm );

Если в том же каталоге, где находится и сам скрипт появится файл "mydbm", значит всё работает.

Автор: rcdimon 27.4.2005, 14:19
korob2001, не работает.

Автор: korob2001 27.4.2005, 14:34
А что пишет??? Если не знаешь, то допиши в начало кода строку:
Код

use CGI::Carp qw( fatalsToBrowser );

Автор: Гость_frenky 29.4.2005, 00:48
И без DB_FIle работает
$key="hehe"
get_lock('gamelimit');
dbmopen(%baza ,"gamelimit",0666) || die;
$baza{$key}="sssss";
dbmclose(%baza);
relase_lock('gamelimit');


Автор: Гость_asd 29.4.2005, 08:39
А может весь глюк в правах доступа. Которые вы указываете при dbmopen и которые стоят на самом перле и на папке, где он создает файл

Автор: korob2001 29.4.2005, 09:19
Цитата

И без DB_FIle работает

Гость_frenky - да это мы знаем, просто DBM файл открытый с dbmopen у чела изначально не работал, DBM созданные с помощью DB_File имеют абсолютно другую стрктуру.

Автор: Гость_rcdimon 6.5.2005, 06:16
Я немного попарился: Изменил права на директории где хранятся DBM'ки. Изменил права самого скрипта и т.д. Короче сами файлы создаются и имеют размер 12Кб. Но в них ничего не записывается и не считывается smile

Автор: korob2001 6.5.2005, 11:07
rcdimon - это нормальное явление, так что не стоит удивляться. Такова природа DBM файлов, они хранят не только информацию помещённую в них из вне, но и информацию о своей структуре, именно по этой причине работать с DBM'кой так же быстро, как и с обычным хешем. smile

Вот так делаем запись:
Код

dbmopen( %dbm, "myfile", 0644 ) or die $!;
   $dbm{ 1 } = "Ля-ля-ля";
dbmclose( %dbm );


А вот так считываем:
Код

dbmopen( %dbm, "myfile", 0644 ) or die $!;
   print $dbm{ 1 };
dbmclose( %dbm );


Если создавал файл с помощью, DB_File, то открывать его нужно таким же способом, потому как у них абсолютно разная структура.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)