TCL 处理参数模板,为什么 [set argv {}]
TCL processing arguments template, why [set argv {}]
以下是来自 tcl wiki link 的模板,此代码可用于处理 tcl 命令行参数。
我想知道为什么我们在第 7 行需要 [set argv {}]
。
# If this script was executed, and not just "source"'d, handle argv
if {[info exists argv0] && [
file dirname [file normalize [info script]/...]] eq [
file dirname [file normalize $argv0/...]]} {
while {[llength $argv]} {
puts [list ooo $argv]
set argv [lassign $argv[set argv {}] flag] ; # Notice Here
switch -glob $flag {
-bool {
set bool 1
}
-option {
set argv [lassign $argv[set argv {}] value]
}
-- break
-* {
return -code error [list {unknown option} $flag]
}
default {
set argv [list $flag {*}$argv]
break
}
}
}
}
foreach file $argv {
puts [format "file: %s" $file]
}
这看起来像是作者在 Tcl wiki page for K 的“取消共享对象”部分中描述的性能优化。基本上它使对象不共享,因此修改不需要创建副本。在循环中操作大列表时,这会产生很大的不同。在这种情况下,我不希望它提供太多收益,因为 argv 通常不会很大,而且它可能只处理一次。
以下是来自 tcl wiki link 的模板,此代码可用于处理 tcl 命令行参数。
我想知道为什么我们在第 7 行需要 [set argv {}]
。
# If this script was executed, and not just "source"'d, handle argv
if {[info exists argv0] && [
file dirname [file normalize [info script]/...]] eq [
file dirname [file normalize $argv0/...]]} {
while {[llength $argv]} {
puts [list ooo $argv]
set argv [lassign $argv[set argv {}] flag] ; # Notice Here
switch -glob $flag {
-bool {
set bool 1
}
-option {
set argv [lassign $argv[set argv {}] value]
}
-- break
-* {
return -code error [list {unknown option} $flag]
}
default {
set argv [list $flag {*}$argv]
break
}
}
}
}
foreach file $argv {
puts [format "file: %s" $file]
}
这看起来像是作者在 Tcl wiki page for K 的“取消共享对象”部分中描述的性能优化。基本上它使对象不共享,因此修改不需要创建副本。在循环中操作大列表时,这会产生很大的不同。在这种情况下,我不希望它提供太多收益,因为 argv 通常不会很大,而且它可能只处理一次。