Стеллецкий В. Рефал/2 |
Другие рефал-функции (написанные на рефале)
(в процессе написания)
В этом разделе приводятся способы решения реальных задач на рефале и других языках программирования.
вверх
Вставка ссылки в HTML-страницу
Реальная задача. Приделали к нашей поисковой системе "Сохраненные запросы".
Понадобилось "налету" сделать ссылку на страницу "Сохраненные запросы" с нескольких разных страниц отображения результатов поиска. При этом, ссылку надо сделать сразу после другой ссылки и в URL перенести часть сведений из URL этой другой ссылки.
На рефале такая задача решалась бы просто. Вот функция, которая делает соответствующий разбор строки и замену:
f e0'<A'e(('<'))1'HREF="'e(('<'))nsr'.asp?lv=12&'ea'si='e2'"'e3'>'e4'</A>'e5=+ e0'<A'e1'HREF="'ensr'.asp?lv=12&'ea'si='e2'"'e3'>'e4'</A>'+ ' | <A'e1'href="/intra/squery.asp?si='e2'&ia='sr'"'e3'><b>Сохраненные запросы</b></A>'+ k/f/e5. e0=e0
1-я строка - разбор строки
2-я - востановление строки до места вставки
3-я - формирование вставки
4-я - обработка строки после места вставки
5-я - обработка случая, когда разбор не прошел
(в нашем случае, если страница не имела искомой ссылки)
Но при написании asp-программы к сожалению не возможно воспользоваться рефалом. Пришлось скучным образом подсчитывать смещения в строке разных поисковых элементов.
Эта же функция приобрела следующий вид:
Function f(p) dim i,j,l,s1,s2,s3 f=p i=instr(1,p,".asp?lv=12&") if i>0 then j=0 Do l=j j=instr(l+1,p,"<A") Loop Until (j>i) or (j=0) j=instr(l+2,p,"HREF=""") s1=mid(p,l+2,j-(l+2)) j=instr(i,p,"si=") l=instr(j,p,"""") s2=mid(p,j,l-j) j=instr(l,p,">") s3="" if j>l+1 then s3=mid(p,l+1,j-(l+1)) j = instr(i,p,"</A>") l = len(p) f = left(p,j+4) & " | <A" &s1& "href=""/intra/squery.asp?" &s2& "&ia=" &mid(p,i-1,1)& """" &s3& "><b>Сохраненные запросы</b></A>" & f(right(p,l-(j+4)+1)) end if end Function
Здесь переменные s1,s2,s3 соответствуют рефал-выражениям e1,e2,e3.
вверх
Конвертирование во входной формат ИРБИС
Реальная задача. Файл, полученный программой swisof1 из файла экспорта базы данных CDS/ISIS, преобразовать в текстовый входной формат ИРБИС (ГПНТБ).
Алгоритм. Надо только метку поля взять в разделители и отметить конец каждого документа.
a =/0/k/b/k/G0A/.. * стандартное начало с обращением к циклу ввода b =k/e/k/ВК/'e'.. * конец файла, а значит и документа ' 0'ea=k/e/k/ВК/'e'..k/ЗК/'e=*****'.k/b/k/G0A/.. * начало документа s1s2s3ea=k/W/'#'s1s2s3': 'ea.k/b/k/G0A/.. * другие строки документа e = * выводим звездочки в конце документа, e1=k/P/e1. * если "закопали" их при начале документа
вход | результат |
0038560000000008170004500## 0011286059 101^aRUS^90 200^aЛазер ускоряет рост бройлеров 215^aС. 33-34 461^cЖивотноводство России^h2012 | #001: 1286059 #101: ^aRUS^90 #200: ^aЛазер ускоряет рост бройлеров #215: ^aС. 33-34 #461: ^cЖивотноводство России^h2012 ***** |