Как использовать expr внутри regsub в TCL?
Предположим, set s1 "some4number"
Я хочу изменить его на some5number.
Я надеялся, что это сработает:
regsub {(\d)(\S+)} $s1 "[expr \\1 + 1]\\2"
Но это ошибки. Что было бы идеальным способом сделать это в TCL?
1 ответ
Решение
В Tcler's Wiki есть много интересных вещей. Одним из них является это:
# There are times when looking at this I think that the abyss is staring back
proc regsub-eval {re string cmd} {
subst [regsub $re [string map {[ \\[ ] \\] $ \\$ \\ \\\\} $string] \[$cmd\]]
}
С этим мы можем сделать это:
set s1 "some4number"
# Note: RE changed to use forward lookahead
set s2 [regsub-eval {\d(?=\S+)} $s1 {expr & + 1}]
# ==> some5number
Но это станет менее ужасным в будущем с 8,7 (в разработке). Вот что бы вы сделали с apply
временный помощник:
set s2 [regsub -command {(\d)(\S+)} $s1 {apply {{- 1 2} {
return "[expr {$1 + 1}]$2"
}}}]
Вместо этого с помощью вспомогательной процедуры:
proc incrValueHelper {- 1 2} {
return "[expr {$1 + 1}]$2"
}
set s2 [regsub -command {(\d)(\S+)} $s1 incrValueHelper]