2017-07-06 2 views
0

Supposons, set s1 "some4number"Comment utiliser expr dans regsub dans TCL?

Je souhaite le remplacer par un numéro5.

J'espérais que cela fonctionnerait:

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

Mais il des erreurs sur. Quel serait le moyen idéal de le faire dans TCL?

+0

Je suis sur mon portable en ce moment, donc je ne peux pas répondre correctement, mais " c'est compliqué ", résume le résumé. Sauf si vous avez Tcl 8.7 où j'ai ajouté une option '-command' à' regsub', mais c'est toujours dans l'état check-out-of-source-control-only. –

Répondre

2

Le Wiki de Tcler a beaucoup de choses chouettes. L'un d'eux est 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\]] 
} 

Avec cela, nous pouvons le faire:

set s1 "some4number" 
# Note: RE changed to use forward lookahead 
set s2 [regsub-eval {\d(?=\S+)} $s1 {expr & + 1}] 
# ==> some5number 

Mais cela deviendra moins terrible à l'avenir avec 8,7 (en développement). Voici ce que vous feriez avec un apply -TERM aide:

set s2 [regsub -command {(\d)(\S+)} $s1 {apply {{- 1 2} { 
    return "[expr {$1 + 1}]$2" 
}}}] 

Avec une procédure d'aide à la place:

proc incrValueHelper {- 1 2} { 
    return "[expr {$1 + 1}]$2" 
} 
set s2 [regsub -command {(\d)(\S+)} $s1 incrValueHelper]