- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在 Tcl 中将字符串从二维数组转换为一维。
例如
lane_out[0][7] -> lane_out[7]
lane_out[1][0] -> lane_out[8]
初始字符串从文件中读取,修改并存储在另一个文件中。此外,输入文件有很多不同类型的字符串需要替换,因此用户在另一个文件中提供查找和替换正则表达式。
对于不需要额外计算的简单字符串,我已经成功地做到了这一点。但我需要帮助来执行表达式。我在想我可以让用户在文件中提供表达式并执行它,但我没有成功。
用户输入文件:
lappend userinput {\[(\d+)]\*$ *}
lappend userinput {\[(\d+)]\[(\d+)]$ [expr{\1*8+\2}]}
我的错误代码:
set line "lane_out[1][0]"
foreach rule $userinput {
foreach {find replace} [regexp -all -inline {\S+} $rule] break
regsub -all $find $line $replace line
set match [regexp -all -inline {expr{.*}} $line] #match = expr{1*8+0}
set val [$match] #supposed to execute what is in match
regsub expr{.*} $line $val line
}
最佳答案
您所做的事情非常复杂:您有一个输入文件、一组搜索/替换规则,并产生一些输出。但是,规则需要调用 expr
。
这是一个虚构的数据文件(data.txt):
lane_out[0][7] = "foo bar"
lane_out[1][0] = "foo bar"
lane_out[1][1] = "foo bar"
lane_out[2][0] = "foo bar"
lane_out[2][1] = "foo bar"
和规则文件 (rules.txt):
{\[(\d+)\]\[(\d+)\]} {\[[expr {\1 * 8 + \2}]\]}
这是我的脚本(search_replace.tcl):
package require Tclx
# Read the rules file
set rules {}
for_file line rules.txt {
lassign $line find replace
lappend rules $find $replace
}
# Read the data, apply rules
for_file line data.txt {
foreach {find replace} $rules {
regsub -all $find $line $replace line
set line [subst $line]
puts $line
}
}
输出:
lane_out[7] = "foo bar"
lane_out[8] = "foo bar"
lane_out[9] = "foo bar"
lane_out[16] = "foo bar"
lane_out[17] = "foo bar"
代码会翻译一行
lane_out[2][1] = "foo bar"
到:
lane_out\[[expr {2 * 8 + 1}]\] = "foo bar"
然后,subst
命令将其替换为:
lane_out[17] = "foo bar"
棘手的部分是转义方括号,以便 expr
可以做正确的事情。
关于regex - 在 regsub 中评估数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23623555/
我的文件夹路径如下: /h/apps/new/app/k1999 我想用以下正则表达式删除 /app/k1999 部分: set folder "/h/apps/new/app/k1999" regs
我需要在 Tcl 中将字符串从二维数组转换为一维。 例如 lane_out[0][7] -> lane_out[7] lane_out[1][0] -> lane_out[8] 初始字符串从文件
我尝试了以下代码: set exp {elem[0]} set temp {elem[0]} regsub $temp $exp "1" exp if {$exp} { puts "#####
我是一名优秀的程序员,十分优秀!