TCL中布尔条件内赋值并评估变量失效问题咨询
TCL while条件中同时赋值与表达式判断的问题
你遇到的情况完全符合TCL规范,下面给你拆解清楚:
问题根源
你写的合并条件代码:
while {[gets $fp line] >= 0 && [regexp {^#} $line] ==0} { puts "Got valid data" }
逻辑是仅当读取到的行不是注释行时,才进入循环体执行处理。如果测试的文件全是注释行,或者读取的第一行是注释行,循环体自然不会执行,但gets已经移动了文件指针,后续仍会继续读取下一行——只是只要读到注释行,循环体就会被跳过。
而分开写法的逻辑是只要没读到文件末尾就进入循环,再在循环内判断是否处理,两者执行路径不同,但最终处理有效行的结果一致(前提是文件里存在有效行)。
关键规范说明
TCL允许在条件表达式中执行带赋值的命令(比如gets $fp line),命令执行后变量会立即生效,后续的表达式可以正常访问该变量。这里的&&是短路求值特性:如果[gets $fp line] >=0为假(读到文件末尾),后面的regexp判断不会执行,这是TCL的正常语言特性。
单语句实现目标逻辑的正确写法
如果想用单条while语句实现和分开写法完全一致的功能(跳过注释行、处理有效行直到文件末尾),可以调整条件逻辑:
while {[gets $fp line] >= 0 && !([regexp {^#} $line])} { puts "Got valid data" }
或者把跳过逻辑写在循环内(依然是单while语句):
while {[gets $fp line] >= 0} { [regexp {^#} $line] && continue puts "Got valid data" }
内容的提问来源于stack exchange,提问作者Gert Gottschalk
相关产品推荐
相关产品推荐

