如何在TCL脚本API中实现getWater与getSoda响应过滤?
解决TCL脚本过滤API响应的问题
问题背景
调用CLI命令getWater时,API返回的结果条目末尾用1标记Water、0标记Soda,但目前会同时返回两类结果;需要实现过滤逻辑:调用getWater只保留末尾为1的条目,调用getSoda只保留末尾为0的条目。
通用过滤实现代码
直接封装一个通用过程,不管是过滤Water还是Soda都能用:
proc filterDrinks {cliCmd targetFlag} { # 执行CLI命令拿到原始输出 set rawOutput [exec $cliCmd] # 把输出按行拆成列表,方便逐行处理 set allLines [split $rawOutput "\n"] set filteredResult [list] foreach line $allLines { # 跳过空行避免干扰 if {$line eq ""} continue # 提取行末尾的标识位 set currentFlag [string index $line end] # 匹配目标标识就保留该行 if {$currentFlag eq $targetFlag} { lappend filteredResult $line } } # 把过滤后的结果重新拼成多行输出 puts [join $filteredResult "\n"] } # 调用方式: # 只拿Water结果 filterDrinks getWater "1" # 只拿Soda结果 filterDrinks getSoda "0"
针对现有代码的快速修改
如果你已经有调用CLI的代码片段,比如:
# 原代码示例 set rawResult [exec getWater] puts $rawResult
可以直接在获取结果后插入过滤逻辑:
set rawResult [exec getWater] set filteredLines [list] foreach line [split $rawResult "\n"] { # 非空行且末尾是1才保留 if {$line ne "" && [string index $line end] eq "1"} { lappend filteredLines $line } } puts [join $filteredLines "\n"]
关键逻辑说明
- 用
string index $line end快速提取每行最后一个字符,也就是标识位 - 通过
foreach遍历所有行,配合条件判断筛选符合要求的条目 - 用
split和join处理多行文本的拆分与拼接,保证输出格式和原始API一致
内容的提问来源于stack exchange,提问作者sam k
相关产品推荐
相关产品推荐

