最简lmap用法:如何直接返回目标值?
Tcl中lmap的最优实现方案
现有两种可行写法,但其中的string trim属于完全冗余操作,list虽能得到正确结果,但看起来像是无意义的包裹:
> lmap x {a b c} {string trim cmd.$x} cmd.a cmd.b cmd.c > lmap x {a b c} {list cmd.$x} cmd.a cmd.b cmd.c
想寻求更优的实现方式,但尝试以下写法时,都只返回第一个结果,无法得到完整列表:
> lmap x {a b c} {return cmd.$x} cmd.a > lmap x {a b c} {return -code return cmd.$x} cmd.a > lmap x {a b c} {return -code continue cmd.$x} cmd.a
正确的优化说明
在Tcl的lmap语法中,脚本块内容会被当作命令执行,直接写cmd.$x会被识别为调用名为cmd.a/cmd.b的命令,必然报错。因此必须通过命令来返回目标字符串:
最优且安全的写法仍是
list
虽然看起来有包裹,但list是Tcl中构造列表元素的标准命令,它能自动处理特殊字符(比如空格、引号),确保每个迭代结果都作为单个列表元素存在,不会破坏结果结构。例如:> lmap x {a "b c"} {list cmd.$x} cmd.a cmd.b\ c这个结果完全符合预期,每个元素都是独立的。
为什么
return写法失效return命令会直接终止整个lmap的执行流程,所以只会返回第一个迭代的结果;而return -code continue是用来跳过当前迭代,不会将值加入结果列表,自然也无法得到完整结果。
如果追求极致简洁,也可以用expr {"cmd.$x"},但这种写法在处理包含特殊字符的元素时会出错,比如:
> lmap x {a "b c"} {expr {"cmd.$x"}} cmd.a cmd.b c
这里cmd.b c被拆成了两个元素,破坏了列表结构,因此不推荐。
内容的提问来源于stack exchange,提问作者thomas
相关产品推荐
相关产品推荐

