Tcl中如何用lsearch匹配含a1[4]变量和通配符*的列表元素
Tcl 匹配含特殊字符列表元素的实现方案
核心问题原因
- lsearch 默认使用 glob 模式匹配,
[、]属于 glob 通配符,直接使用会被解析为匹配单字符的规则,不会作为字面量匹配 - Tcl 双引号包裹的内容会解析方括号内的语句为命令调用,直接写
set var "a1[4]"会触发命令不存在报错
正确实现步骤
- 定义存储匹配片段的变量时,用大括号包裹避免方括号被解析为命令:
set var {a1[4]}
如果需要用双引号定义,需要转义方括号:
set var "a1\[4]"
- 转义变量中的 glob 特殊字符,再构造匹配规则执行搜索:
# 构造测试列表 set list_ {0,a2,4 0,a1[4],3 0,a1[4],5} # 转义变量中的方括号为glob字面量 set escaped_var [string map {[ \[ ] \]} $var] # 搜索匹配项的索引 set match_indexes [lsearch -all -glob $list_ "0,$escaped_var,*"] # 直接返回匹配到的元素,加 -inline 参数即可 set match_elements [lsearch -all -glob -inline $list_ "0,$escaped_var,*"]
执行后match_elements的结果为{0,a1[4],3 0,a1[4],5},符合需求。
内容的提问来源于stack exchange,提问作者Minu
相关产品推荐
相关产品推荐

