немного отойду от основной темы сиквела и друпала и покажу на примере какие возможности бывают сокрыты в скриптовых языках.
предметом небольшого погружения станет язык awk. это скриптовый язык с помощью которого можно разбирать потоки (файлы или их массив, пайпы), взаимодействовать с юзером и т.д.
передо мной встала задача - необходимо распарсить файл с набором скриптов, которые создают триггеры, фукнции, процедуры. общий шаблон имеет следующий вид:
delimiter $$
drop procedure if exists proc_name$$
create procedure proc_name
....
end
$$
delimiter ;
delimiter ;
необходимо из одного скрипта получить много файлов в каждом из которых будет находится определение лишь одной процедуры. файл должен быть назван по имени процедуры.
первая часть задачки замечательно решается с помощью с помощью утилиты csplit. только выдрать имя файла у меня так и не получилось (хотя это и не означает, что этого нельзя сделать). на помощь, как всегда, пришел великий и ужасный гугл, который, кроме прочей ерунды, выдал на первую страницу ссылку на доки по этому замечательному языку.
язык умеет делать следующие штуки:
- парсит построчно или "постолбцово" входной поток;
- имеет встроенные функции;
- понимает regexp;
- может вызывать внешние скрипты;
- позволяет в процессе выполнения скрипта посылать запросы юзеру;
- язык процедурный;
это все что я за полдня успел откопать.
приведу прожку, которая решает поставленную задачу с небольшими комментариями:
BEGIN{
# получение подкаталога для сохранения файлов
print "Enter folder to place files:";
getline folder < "-";
print | "mkdir -p " folder ";";
folder = folder "/";
file = ""
delimiter = 0;
}
{
pos = index(tolower($0), " if exists ");
# проверяем новая ли это процедура
if (pos > 0) {
dot = index($0, ".");
# выделяем имя
file = substr($0, dot + 1, length($0) - dot - 2);
delimiter = 0;