删除存储在变量中的内容

时间:2014-10-23 22:12:32

标签: variables tcl

我对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
}

1 个答案:

答案 0 :(得分:1)

Tcl中有许多设置命令,包括lappendset

lappend命令将变量的值设置为变量中包含的列表(可能为空),并将指定的值添加为最后一个元素(它也可以是作为新尾部添加的多个值)旧名单)。如果要存储一系列值,通常会使用此功能。

set命令使用指定的值替换变量中的值(或者返回变量中的值,不提供第二个参数)。如果您想在存储新值之前删除旧值,则使用此选项。

你可能想写这样的东西:

set old [list]
set new [list]
foreach element $actual_item {
    # ...
    lappend old $var_2
    lappend new $var_3
}

这将删除oldnew中的所有先前内容,然后将每次迭代中的值存储在其中。

您的代码有点难以理解,但这些行:

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 cdnew = 12 34

此代码段不会删除每行中的最后一项。如果您仍然希望这样做,那么很容易对其进行修改。

文档:closeexprforeachlappendllengthlrangelreplace,{{3 }},openreadregexp