我知道我一直在问很多问题,但我仍在学习tcl,到目前为止,在任何地方都找不到与该问题类似的东西。例如,是否可以用一个变量替换tcl中的一组f命令function0
?
我希望能够替换以下代码;
set f [listFromFile $path1]
set f [lsort -unique $f]
set f [lsearch -all -inline $f "test_*"]
set f [regsub -all {,} $f "" ]
set len [llength $f]
set cnt 0
使用变量,function0
因为同一代码在脚本中多次出现。我应该提一下,它同时出现proc
在proc
上面的代码与类似的脚本有关
while {$cnt < $len} {
puts [lindex $f $cnt]
incr cnt
after 25; #not needed, but for viewing purposes
}
变量用于存储值。要隐藏(封装)某些代码行,您需要一个命令过程,该过程是使用proc
命令定义的。
您想隐藏以下几行
set f [listFromFile $path1]
set f [lsort -unique $f]
set f [lsearch -all -inline $f "test_*"]
set f [regsub -all {,} $f "" ]
set len [llength $f]
set cnt 0
从而能够仅调用function0 $path1
并一次完成所有这些计算。此外,您想使用在如下代码中调用过程的结果:
while {$cnt < $len} {
puts [lindex $f $cnt]
# ...
你想要的方式function0
来产生三种不同的价值观,在存储cnt
,len
和f
。有几种方法可以使命令过程返回多个值,但是这里最干净的解决方案是使它返回一个值。您要打印的列表。len
可以使用单个命令从该列表中计算in的值,cnt
最好在命令过程之外执行in的初始化。您得到的是这样的:
proc function0 path {
set f [listFromFile $path]
set f [lsort -unique $f]
set f [lsearch -all -inline $f test_*]
set f [regsub -all , $f {}]
return $f
}
您可以这样使用:
set f [function0 $path1]
set len [llength $f]
set cnt 0
while {$cnt < $len} {
puts [lindex $f $cnt]
incr cnt
after 25; #not needed, but for viewing purposes
}
或像这样:
set f [function0 $path1]
set len [llength $f]
for {set cnt 0} {$cnt < $len} {incr cnt} {
puts [lindex $f $cnt]
after 25; #not needed, but for viewing purposes
}
或像这样:
set f [function0 $path1]
foreach item $f {
puts $item
after 25; #not needed, but for viewing purposes
}
这就是为什么我不费心创建一个返回三个值的过程的原因:您只需要一个值。
glenn jackman在关于的使用的另一个答案中提出了一个非常好的观点(实际上是两点)regsub
。为了完整起见,我将在这里重复。
Tcl有点令人困惑,因为它通常允许对不是正式字符串的数据结构进行字符串操作(如字符串替换)。这使该语言非常强大且富有表现力,但也意味着新手并不总是能像普通类型系统那样给他们带来好处。
在这种情况下,您可以listFromFile
通过从文件中读取字符串然后split
在其上使用来在内部创建列表结构。从这一点开始,它就是一个列表,您应该只对其执行列表操作。如果你想拿出你的数据的所有逗号你要么应该在列表中的每个项目执行该操作,否则执行操作中listFromFile
,前分裂的文本。
列表上的字符串操作可以工作,但有时结果会出现乱码,因此应避免将它们混合使用。另一个好处是,在这种情况下,它比更为string map
可取regsub
,否则,它会使代码更加清晰。
文档:for,foreach,lindex,llength,lsearch,lsort,proc,puts,regsub,set,split,string,而
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句