К сожалению, я пока не могу публиковать комментарии, и это должно было быть больше похоже на комментарий к предыдущему решению и вопрос о том, что такое фактическая свинка, сгенерированная Cache. Поэтому, если кто-то ответит и подтвердит мои подозрения ниже, было бы здорово, так как я думаю, что в предыдущем решении есть ошибка.
Итак, предположим, что Cache компилирует решение ниже:
ClassMethod Replace(str, from, to As %String)
{
while $F(str,from) {
s str=$P(str,from)_to_$P(str,from,2,$L(str,from))
}
quit str
}
Что-то вроде этого:
REPLACE(str,from,to)
;
F I=1:1 Q:'$F(str,from) D
. S str=$P(str,from)_to_$P(str,from,2,$L(str,from))
Q str
В этом коде есть серьезная ошибка, которая приведет к бесконечному циклу, когда моя фактическая переменная from
содержится в to
,
Измените, например, «ЛИЗА» на «ЭЛИЗА», «ЭЛИЗАБЕТ», «АЛИЗА», «МЕЛИЗА».
Пример, используемый ниже, заменяет DAN на DANIEL.
Протестировано на GTM (цикл прерывается вручную после 10 итераций, иначе он будет бесконечным):
GTM>W $$REPLACE^ZZTEST("DAN SMITH","DAN","DANIEL")
DANIELIELIELIELIELIELIELIELIELIEL SMITH
Имея это в виду, я предлагаю что-то вроде:
REPLACE2(str,from,to)
;
N str2
S str2=""
F I=1:1:$L(str,from)-1 D
. S str2=str2_$P(str,from)_to
. S str=$P(str,from,2,$L(str,from))
;add the last piece if it exists or in case nothing to replace add all.
Q str2_str
Проверено в GTM:
GTM>W $$REPLACE2^ZZTEST("DAN SMITH","DAN","DANIEL")
DANIEL SMITH
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN","DAN","DANIEL")
DANIEL SMITH DANIEL
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN DAN DAN","DAN","DANIEL")
DANIEL SMITH DANIEL DANIEL DANIEL
GTM>W $$REPLACE2^ZZTEST("DAN SMITH DAN DAN DAN","DANA","DANIEL")
DAN SMITH DAN DAN DAN
Конечно, это не будет окончательным решением, так как оно все еще содержит ошибки, например, генерируется имя LISABETH....
GTM>W $$REPLACE2^ZZTEST("ELISABETH SMITH","ELISA","LISA")
LISABETH SMITH
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA","ELISA","LISA")
LISA LISABETH SMITH LISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA","LISA")
ELISALISABETH SMITHLISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA ","LISA")
ELISA ELISABETH SMITH ELISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA"," ELISA","LISA")
ELISALISABETH SMITHLISA
GTM>W $$REPLACE2^ZZTEST("ELISA ELISABETH SMITH ELISA","ELISA ","LISA")
LISAELISABETH SMITH ELISA
Чтобы обойти эту проблему, необходимо добавить дополнительную логику, чтобы понять, что если имя в начале должно быть «ИМЯ», если в конце «ИМЯ», в противном случае в середине «ИМЯ».
что-то вроде (это, вероятно, можно оптимизировать):
REPLACE2(str,from,to)
;
N from2,str2
S str2=""
S from2=" "_from_" "
; check if string begins with name
I $E(str,1,$L(from))_" "=(from_" ") S str2=to,str=$E(str,$L(from)+1,$L(str))
; search for name with spaces
F I=1:1:$L(str,from2)-1 D
. S str2=str2_$P(str,from2)_" "_to
. S str=" "_$P(str,from2,2,$L(str,from2))
; check if finishes with name
I $L(str)>=$L(from) D
. I $E(str,$L(str)-$L(from),$L(str))=(" "_from) S str2=str2_$E(str,1,$L(str)-$L(from))_to,str=""
.
Q str2_str ;add the last piece if it exists
Тест на GTM:
GTM>W $$REPLACE2^ZZTEST("MELISA ELISA ELISABETH ALISA ELISA","ELISA","LISA")
MELISA LISA ELISABETH ALISA LISA
GTM>W $$REPLACE2^ZZTEST("MELISA ELISA ELISABETH ALISA ELISA","LISA","ELISA")
MELISA ELISA ELISABETH ALISA ELISA
GTM>W $$REPLACE2^ZZTEST("LISA MELISA ELISA ELISABETH LISA ALISA LISA","LISA","ELISA)
ELISA MELISA ELISA ELISABETH ELISA ALISA ELISA
GTM>W $$REPLACE2^ZZTEST("LISA MELISA ELISA ELISABETH LISA ALISA LISA","LISA","ELISA)
ELISA MELISA ELISA ELISABETH ELISA ALISA ELISA
Но все же может не удовлетворить все ваши потребности, если вы решите или получите информацию, например:
GTM>W $$REPLACE2^ZZTEST("ELISA,SMITH","ELISA","LISA")
ELISA,SMITH
person
C4xuxo
schedule
29.03.2016
without using $R
? $R[АНДОМ] ? - person tsafin   schedule 29.03.2016