2017-07-06 114 views
0

假设,set s1 "some4number"如何在TCL的regsub中使用expr?

我想将其更改为some5number。

我希望这会工作:

regsub {(\d)(\S+)} $s1 "[expr \\1 + 1]\\2" 

但它的错误了。在TCL中这样做的理想方式是什么?

+0

我在我的手机现在,所以我不能回答正确,但“这是烦人的复杂“是总结。除非你有Tcl 8.7,我在'regsub'中添加了'-command'选项,但是它仍处于check-out-source-control-only状态。 –

回答

2

Tcler's Wiki有很多整洁的东西。其中之一是this

# 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 -term帮手做什么:

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]