我有一个像
这样的字符串set arr_set(variable.abc) {12,13}
set arr_set(variable.def) {15,16}
set arr_set(dont_care) {0,0}
其中arr_set是一个数组集,variable_abc
是它的一个元素。我将所有这些信息存储在一个文件中。我想做的是,阅读每一行,无论我在哪里看到"变量。"我读了它指向的内容,就像在第一种情况下,它指向abc
,然后指向def
。
我写了这个脚本,但显然没有存储信息。
regexp -nocase {^\s*set arr_set[(]variable\s*.\s*(.*)$} $lines match tag value
其中lines
是包含
set arr_set(variable.abc) {12,13}
我无法弄清楚这里遗漏的正则表达式是什么。有人可以看看吗?
答案 0 :(得分:2)
分解你的正则表达式:
^\s*set arr_set[(]variable\s*.\s*(.*)$
您的正则表达式没有标记和值的单独组,但是从您的代码中,您似乎希望它们分开。您有额外的空间匹配,与您的数据不匹配。
set lines {set arr_set(variable.abc) {12,13}}
regexp -nocase {\(variable\.([^)]*)\)\s*(.*)} $lines match tag value
puts "$tag $value"
或
regexp -nocase {^\s*set\s*arr_set\(variable\.([^)]*)\)\s*(.*)} $lines match tag value
分解:
\(variable\.([^)]*)\)\s*(.*)
答案 1 :(得分:2)
(Glenn Jackman在评论中提醒我array names
可以采用全局模式来选择名称。由于该功能在这种情况下显着简化了代码,我已经重写了我使用它的答案。)
如果你有命令
set arr_set(variable.abc) {12,13}
set arr_set(variable.def) {15,16}
set arr_set(dont_care) {0,0}
在您source
的文件中,您可以使用此文件获取标记值对的列表:
lmap name [array names arr_set variable.*] {
set tag [lindex [split $name .] 1]
list $tag $arr_set($name)
}
# => {abc 12,13} {def 15,16}
(如果您不想要该值,请使用set tag
代替list $tag $arr_set($name)
)
对于Tcl 8.5及更早版本,这样做(将结果存储在res
中):
set res {}
foreach name [array names arr_set variable.*] {
set tag [lindex [split $name .] 1]
lappend res [list $tag $arr_set($name)]
}
(如果您不想要该值,请使用lappend res $tag
代替lappend res [list $tag $arr_set($name)]
)
请注意,只有在数组名称选择可以表示为glob模式时,此解决方案才有效。在不可能的情况下,仍然需要沿着这些方向的解决方案:
lmap name [array names arr_set] {
lassign [split $name .] prefix tag
if {$prefix in {foo bar baz}} {
list $tag $arr_set($name)
} else {
continue
}
}
文档:array,continue,foreach,if,lappend,lassign,lindex,{{3 }},list,lmap替换,lmap,set,source