【发布时间】:2014-10-26 21:22:38
【问题描述】:
尝试深入研究 TcL 脚本。我发现我正在编写很多重复的代码,我想弄清楚如何使它成为一个过程,以缩短我的脚本。我对整个过程的想法可能是错误的。我目前正在复制 foreach 循环并更改变量的名称。我可以通过一个进程来执行此操作,以便我只键入一次 foreach 循环吗?
一个例子是,我需要一个过程来搜索列表中“应该”存在的字符串。如果他们不在那里,我想输出到报告文件。
如果不清楚,我深表歉意:
类似的东西 设置强制全局“{ ^service tcp-keepalives-in} { ^service tcp-keepalives-out} { ^service timestamps debug datetime msec}"
set run "{
version 12.4}
{service timestamps debug datetime msec}
{service timestamps log datetime msec}
"
proc mandatory {mandatoryList config} {
foreach command $mandatoryList {
set x 1
foreach line $config {
if {![regexp $command $line]} {
incr x
}
}
if {$x>[llength $config]} {
append report $command\n
return $command\n
}
}
}
mandatory $mandatoryGlobal $run
puts $report
#I would expect that report shows
#^service tcp-keepalives-in
#^service tcp-keepalives-out
#But I only have this????
#^service tcp-keepalives-in
#If I run the foreach loop without the proc & change the variables,
#it works as expected
此外,我已对其进行了编辑,以便更清楚地了解我想要做什么。在我重新阅读我的问题后,Donal Fellows 的回答完美,但我的目标并不清楚。多纳尔,我真的很感谢你的努力和一个惊人的解释。
【问题讨论】:
-
你不需要
set y,你可以直接使用mandatory $value $run。但是,如果多纳尔没有回答,您将不得不更好地解释您的其他问题。 -
看起来必须使用
lsearch。类似foreach value $mandatoryValues { if {[lsearch -regexp $list $value] == -1} {...} } -
string map {process procedure} $question -
我正在寻找的是类似于 Jerry 所写的内容,但我希望能够更改变量,因此我不会重新编写循环。我真的才刚刚开始编程,所以如果我不清楚我的目标,请原谅我。这是我所做的一个示例,但我正在重写列表的不同部分的相同代码。附加报告“在配置中找不到强制命令\n” foreach 命令 $mandatoryGlobal { set x 1 foreach line $run { if {![regexp $command $line]} { incr x } } if {$x>[llength $run ]} { 追加报告 $command\n } }