Tcl string range用法疑问:精简代码后输出为何不符合预期?
问题分析与错误原因
先拆解两段式代码的执行逻辑:
- 第一步
set x 0000$x:将原始变量x=400拼接成字符串0000400,并重新赋值给x - 第二步
set x [string range $x [expr [string length $x] -5] end]:此时x的值是0000400,长度为7,计算7-5=2后,取索引2到末尾的子串,得到目标结果00400
而精简后的一行代码set x [string range $x [expr [string length "0000$x"] -5] end]的核心错误在于Tcl的变量替换时机:
Tcl执行命令时会先完成所有变量替换,再执行命令逻辑。这里"0000$x"中的$x替换的是原始值400,所以"0000400"的长度为7,计算得7-5=2。接下来string range $x 2 end中的$x同样是原始值400,字符串400的索引范围是0到2,取索引2到末尾的子串,就只剩下最后一个字符0。
如果要精简成一行,正确写法应先完成拼接再截取:
set x [string range "0000$x" [expr [string length "0000$x"] -5] end]
或者用Tcl更直接的补零方案:
set x [format "%05d" $x]
内容的提问来源于stack exchange,提问作者dana
相关产品推荐
相关产品推荐

