parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Призывается к помощи клуб знатоков: как максимально лаконично/эффективно распарсить поля форм вида name.1.2=value в многовложенный хеш? (Или изменить код от Misha, rip_max?)

andylars 20.09.2015 23:23 / 21.09.2015 01:37

Как-то задавал вопрос по парсингу данных из форм.

В итоге нашлось решение:
которое парсит name[1][2]=value.. в многовложенный хеш,

мне надо примерно тоже самое, но разделитель (точка), т.е. шаблон вида:
name.a.b.c=value должен преобразоваться в многовложенный хеш.

Каюсь, с регулярками дружу пока плохо, чтобы без граблей быть уверенным,
да и мысли, что в моем случае split может оказаться быстрее,
а значит код наверное значительно может похудеть?

Плюс ко всему "синтаксис" как бы совпадает с нативным у парсера, и может можно и вовсе,
как-то безопасно транслировать в код.


Факты: сам уже наигрался с "ручным" парсингом и циклами в хеше и убедился как быстро можно отожрать производительность.

И поэтому призываю гуру помочь.


-----
P.S.:

Собственно найденый мной код для name[1][2]=value
@CLASS
serialForm

@getData[][names]
	$self.data[^hash::create[]]
	$hBlackList[$.action[1]]
	$oRegex[^regex::create[\^[([^^\^]]+)\^]][g']]
	^form:fields.foreach[field;value]{
		^if(!def $hBlackList.$field){
			^self.parseData[$field;$value]
		}
	}
	$result[$self.data]
	
@parseData[field;value][t;h]
$t[^field.match[$oRegex]]
^if(def $t.prematch){
	$h[^create[$self.data;$t.prematch]]
	^t.menu{
		^if(^t.line[] == $t){
			$h.[$t.1][$value]
		}{
			$h[^create[$h;$t.1]]
		}
	}
}{
	$self.data.[$field][$value]
}


@create[h;k]
^if(!($h.$k is "hash")){
	$h.[$k][^hash::create[]]
}
$result[$h.$k]