LINUX.ORG.RU

Perl. Проверка условия, содержащегося в переменной.

 , pgperl,


0

2

Друзья! Подскажите, отговорите, укажите путь, пожалуйста.

К примеру есть хеш Состояние.

my $state = {
    level => 1,
    life => 100,
    money => 1234
};

Нужно как-то в БД хранить квесты. Хочу заложить уловия применимости (доступности) квеста. Что-то вроде «если уровень больше 2, а денег больше 1000». И изменения состояния, которое будет в случае success и fail квеста. Тоже что-то вроде «уменьшить денег на 10, прибавить уровень на 2».

Думается, что эти условия квеста и структуру изменений по его выполнению, можно было бы тоже хранить в json в БД, парсить на PgPerlU до преобразования в хеш. А дальше просто «применить».

т.е. хочу хранить подобное (уже развернутый хеш из json):

{
    level => '>10',
    money => '>=1000'
}

чтобы просто сделать что-то вроде

if (eval "" . $state->{level} . $quest->{level}) {
    # в строке условия получится "1 >10", т.е. false (0)
    #...
}

Но тогда будет вопрос с выбором всех квестов, доступных для данного состояния игрока. Т.к. в простой селект будет сложно запихнуть такие закидоны. Но, может, на той же хранимой процедуре сделать выборку, скомпоновав текст запроса?...

В общем, кто что думает по этой теме?

★★★★★

Последнее исправление: bvn13 (всего исправлений: 1)

Пользуешься реляционной БД — используй её возможности и правила. SELECT, JOIN, GROUP BY и т.д. Для хардкорных json'ов другие базы были придуманы.

Olegymous ★★★
()

Подобные выборки лучше делать на самом низком уровне. Как можно ближе к БД.

Если говорить про Perl, то я бы отказался от eval EXPRESSION везде где это возможно.

outtaspace ★★★
()

А нельзя хранить в БД тип, предикат и значение?

Например:

«type»: «level», «predicate»: «>=», «value»: «2»

Написать классы для предикатов и т.д...

anonymous
()
Ответ на: комментарий от anonymous

Хм... Может, и можно... Но, думаю, обойдусь без извратов.

bvn13 ★★★★★
() автор топика

хранимые процедуры в БД

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.