首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数学评价

数学评价
EN

Stack Overflow用户
提问于 2014-05-13 05:40:32
回答 1查看 140关注 0票数 3

在Tcl中,我需要将字符串从二维数组转换为一维数组。

例如

代码语言:javascript
复制
lane_out[0][7]  -> lane_out[7]  
lane_out[1][0]  -> lane_out[8]

初始字符串从文件中读取,修改后存储在另一个文件中。此外,输入文件有许多不同类型的字符串需要替换,因此用户在另一个文件中提供查找和替换regex。

对于不需要额外计算的简单字符串,我已经成功地做到了这一点。但我在执行表达式方面需要帮助。我在想,我可以让用户在文件中提供表达式并执行该表达式,但我没有成功。

用户输入文件:

代码语言:javascript
复制
lappend userinput {\[(\d+)]\*$ *}
lappend userinput {\[(\d+)]\[(\d+)]$ [expr{\1*8+\2}]}

我的破译代码:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 07:37:03

您所做的工作非常复杂:您有一个输入文件、一组搜索/替换规则,并产生一些输出。然而,这些规则要求调用expr

下面是一个虚构的数据文件(data.txt):

代码语言:javascript
复制
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):

代码语言:javascript
复制
{\[(\d+)\]\[(\d+)\]} {\[[expr {\1 * 8 + \2}]\]}

下面是我的脚本(search_replace.tcl):

代码语言:javascript
复制
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
    }
}

输出:

代码语言:javascript
复制
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_out2 = "foo bar“ 至: lane_out[expr {2 *8+ 1}] = "foo bar“
  • 然后,subst命令将其替换为: lane_out17 = "foo bar“
  • 棘手的部分是转义方括号,以便expr能够做正确的事情。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23623555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档