Стеллецкий В.
Рефал/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'&amp;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& "&amp;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
*****