Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Извлечение данных из формата dbm в txt, Помогите разобраться со скриптом. 
:(
    Опции темы
Martein
Дата 15.6.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Здравсвуйте, есть вопрос на который ни где не могу найти ответ.
Стоит apache. Пути к сайтам на сервере и информация о них храниться в файле vhost.db. Вопрос в том чем такую бд можно открыть, пробовал различные программы - выдавали ошибку об отсутсвии индекса, повреждение чего то там... Открываю с помощью блокнота очень много непонятных символов. Плюс к тому же записи повторяються по несколько раз... в общем полная неразбериха. Начал копаться выяснил инофрмацию о формате db

Код

# Хэш файл
MapType: dbm[=type], MapSource: Путь к существующему файлу в файловой системе Unix

Здесь, источник  это двоичный файл DBM формата содержащий то же самое содержимое что и простой текстовый файл, однако в специальном виде, оптимизированном
для действительно быстрого поиска. Этот тип может быть sdbm, gdbm, ndbm, или db в зависимости от настроек при компиляции. Если тип опущен, выбирается тип
установленный по умолчанию при компиляции. Вы можете создавать такой файл любой утилитой DBM или следующим Perl скриптом. Убедитесь что он настроен для создания
требуемого типа DBM файла. Этот пример создает файл NDBM.

#!/path/to/bin/perl
##
##  txt2dbm -- convert txt map to dbm format
##

use NDBM_File;
use Fcntl;

($txtmap, $dbmmap) = @ARGV;

open(TXT, "<$txtmap") or die "Couldn't open $txtmap!\n";
tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!\n";

while (<TXT>) {
  next if (/^\s*#/ or /^\s*$/);
  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
}

untie %DB;
close(TXT);

$ txt2dbm map.txt map.db



Вот вырезка из моего конфига vhost.conf
Код

# define the map file
RewriteMap   vhost      dbm=DB:conf/vhost 


На одном из форум подсказали ссылку на следующий код, якобы переводящий из dbm в txt. Что с этим кодом делать не знаю хотел у вас совета спросить - как должен называться входной файл, как запускать скрипт - не знаю. Если кто то может подсказать, то буду очень благодарен если подскажетет как запускать через ActivePerl.
Код

#!/usr/bin/perl

use NDBM_File;
use Fcntl;

tie %fhand,"NDBM_File","demodata",O_RDWR|O_CREAT,0777;

if ($ARGV[0] =~ /^get$/i)
        {
        if ($#ARGV == 1) {
                $result = ($fhand{$ARGV[1]} or "no such entry");
                }
        }
if ($ARGV[0] =~ /^set$/i)
        {
        if ($#ARGV == 2) {
                $fhand{$ARGV[1]} = $ARGV[2];
                $result = "Database updated";
                }
        }
if ($ARGV[0] =~ /^list$/i)
        {
        if ($#ARGV == 0) {
                foreach (sort keys %fhand){
                $result .= sprintf ("%8s %s\n",
                        $_,$fhand{$_});
                }
                chop $result;
                }
        }

$result ||= "Invalid call";
print "$result\n";
untie %fhand;


P.S. Рад любой инфе, если кто то может помочь но нет времени, могу скромно но все же отблагодарить вебманями...

Это сообщение отредактировал(а) Martein - 17.7.2009, 15:05
PM   Вверх
KSURi
Дата 15.6.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Входной файл должен называться demodata.
Скрипт понимает три команды:
  • get <key> - получить значение ключа по имени key
  • set <key> <value> - установить значение ключа по имени key в value
  • list - вывести все пары ключ-значение
Запускать соответственно так:
Код

C:\> perl script.pl <cmd> [key] [value]


Это сообщение отредактировал(а) KSURi - 15.6.2009, 23:09


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Martein
  Дата 16.6.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Установил ActivePerl 5.10, положил в папку C:\Documents and Settings\M@rtein скрипт 1.pl
Запустил - скрипт выдал ошибку:
Код

C:\Documents and Settings\M@rtein>perl 1.pl list
Can't locate NDBM_File.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .
) at 1.pl line 2.
BEGIN failed--compilation aborted at 1.pl line 2.


Что то в системе не так установлено или что может быть не так?!

Чуть не забыл вот код скрипта что я запускаю - 1.pl
Код

#!/usr/bin/perl
use NDBM_File;
use Fcntl;
tie %fhand,"NDBM_File","demodata",O_RDWR|O_CREAT,0777;
if ($ARGV[0] =~ /^get$/i)
        {
        if ($#ARGV == 1) {
                $result = ($fhand{$ARGV[1]} or "no such entry");
                }
        }
if ($ARGV[0] =~ /^set$/i)
        {
        if ($#ARGV == 2) {
                $fhand{$ARGV[1]} = $ARGV[2];
                $result = "Database updated";
                }
        }
if ($ARGV[0] =~ /^list$/i)
        {
        if ($#ARGV == 0) {
                foreach (sort keys %fhand){
                $result .= sprintf ("%8s %s\n",
                        $_,$fhand{$_});
                }
                chop $result;
                }
        }
$result ||= "Invalid call";
print "$result\n";
untie %fhand;


Это сообщение отредактировал(а) Martein - 16.6.2009, 11:46
PM   Вверх
shamber
Дата 16.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Код

Can't locate NDBM_File.pm in @INC  

Чего-то не хватает smile
модуля для работы с dbm. smile
Установите NDBM_File

Если не знаете как, читайте тут

Это сообщение отредактировал(а) shamber - 16.6.2009, 11:52
PM MAIL Jabber   Вверх
Martein
Дата 16.6.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



KSURi, Спасибо огромное хотел было поставить плюсик, но я здесь новичок пока, все равно респект  smile 
PM   Вверх
Martein
Дата 16.6.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



shamber, не получаеться установить
C:\Perl\perl-5.8.9 - это путь до разархивированного NDBM_File
Код

C:\Perl\perl-5.8.9>perl Makefile.PL
Can't open perl script "Makefile.PL": No such file or directory


Как еще можно попытаться установить?
PM   Вверх
amg
Дата 16.6.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Вообще то, в perl-5.8.9 и выше этот модуль уже стандартный. Чем устанавливать его самостоятельно, поставьте perl-5.10.

Оба! Прочитал посты выше, оказывается, perl-5.10 уже стоит. 
Может, этот модуль использует чисто никсовые фичи и на винде не имеет смысла?

Это сообщение отредактировал(а) amg - 16.6.2009, 16:25
PM MAIL   Вверх
shamber
Дата 17.6.2009, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



был не прав погорячился smile 
поищите другие модули для работы с dbm. Например этот
PM MAIL Jabber   Вверх
Martein
Дата 17.6.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



К сожалениюэто модуль не помог. Я думаю то ч то ты первый раз рекомендовал был правильный, но его как то нужно установить видать...? 
PM   Вверх
KSURi
Дата 17.6.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Не знаю, какой конкретно тип DBM используется в Apache, поэтому есть несколько предложений:
1. воспользоваться AnyDBM_File
2. вместо tie/untie попробовать dbmopen/dbmclose


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Martein
  Дата 20.6.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



KSURi что при установке AnyDBM_File, что NDBM_File - вылазиет одинаковое сообщение после перехода в диру с модулем и выполнения команды perl Makefile.PL
Код

Can't open perl script "Makefile.PL": No such file or directory

Как нужно установить модуль подскажите? или че не так делаю...
PM   Вверх
shamber
Дата 20.6.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



напишите в коммандной строке ppm. И потом в окошке выберите нужный модуль
PM MAIL Jabber   Вверх
Martein
Дата 22.6.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Цитата(shamber @ 20.6.2009,  13:57)
напишите в коммандной строке ppm. И потом в окошке выберите нужный модуль

Спасибо за совет, но я пока разбирался с установкой, дошел и до этого способа
Перехожу в режим View all packages и в строке поиска ввожу название файла. Ни того ни другого там нету...  smile 
PM   Вверх
shamber
Дата 22.6.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Martein, у меня присутствует. попробуйте добавить дополнительные репозитарии.

Добавлено через 1 минуту и 3 секунды
список есть тут.
PM MAIL Jabber   Вверх
Martein
  Дата 17.7.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Так и не получилось вопрос решить, решил действовать иначе. Поставил линукс, там запустил скрипт.  Предварительно разместив в своем домашней папке скрипт и файл базы данных. Запускаю на выполнение, скрипт отрабатывает но безрезультатно
Код

martein@martein-desktop:~$ /usr/bin/perl /home/martein/script.pl list
Invalid call

Может есть еще какие то идеи как открыть файл бд??!!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.