我对tcl语言很新。我正在编写一个脚本来自动化一个过程。我写的代码如下,内容从一个名为sample.tcl的文件中读取。这个文件的内容经常改变..但是我发现存储在变量old和new中的值会一直在添加更改而不是覆盖它们。我想知道必须使用什么命令而不是lappend来执行此操作。
此外,如果我执行echo $ old,则会在行的开头添加一个名为tixScrolledListbox的内容。我不确定这是什么意思。如果有人能指导我,我真的很感激。 TIA。
set fpp [open sample.tcl]
set b [read $fpp]
set c [split $b "\n"]
set item [llength $c]
set actual_column [expr $item -1]
set actual_item [lreplace $c $actual_column $actual_column]
close $fpp
foreach element $actual_item {
set f [regexp {(.*)\t+(.*)} $element var1 var2 var3]
set var_2 [regsub -all {\s} $var2 {}]
set var_3 [regsub -all {\s} $var3 {}]
lappend old $var_2
lappend new $var_3
}
答案 0 :(得分:1)
Tcl中有许多设置命令,包括lappend
和set
。
lappend
命令将变量的值设置为变量中包含的列表(可能为空),并将指定的值添加为最后一个元素(它也可以是作为新尾部添加的多个值)旧名单)。如果要存储一系列值,通常会使用此功能。
set
命令使用指定的值替换变量中的值(或者返回变量中的值,不提供第二个参数)。如果您想在存储新值之前删除旧值,则使用此选项。
你可能想写这样的东西:
set old [list]
set new [list]
foreach element $actual_item {
# ...
lappend old $var_2
lappend new $var_3
}
这将删除old
和new
中的所有先前内容,然后将每次迭代中的值存储在其中。
您的代码有点难以理解,但这些行:
set item [llength $c]
set actual_column [expr $item -1]
set actual_item [lreplace $c $actual_column $actual_column]
似乎意味着您希望变量actual_item
包含c
中除最后一项之外的所有项目。如果是这样,您可以使用此调用来执行此操作:
set actual_item [lrange $c 0 end-1]
请注意,您应始终将expr
的参数放在大括号中,例如
set actual_column [expr {$item - 1}]
这种形式更安全,更有效。
您还可以在regexp
中指定f
来电的返回值,但绝不使用该变量。
有点像
set fpp [open sample.tcl]
set b [read $fpp]
close $fpp
set old [list]
set new [list]
foreach {o n} [regexp -all -inline -- {[^\n\t]+} $b] {
lappend old [regsub -all {\s} $o {}]
lappend new [regsub -all {\s} $n {}]
}
有帮助吗?当我在文本上使用该代码时
a b 1 2
c d 3 4
(注意:" d"以及" 3"之间有一个标签。)
我得到old
= ab cd
和new
= 12 34
。
此代码段不会删除每行中的最后一项。如果您仍然希望这样做,那么很容易对其进行修改。
文档:close,expr,foreach,lappend,llength,lrange,lreplace,{{3 }},open,read,regexp