1

以下是来自 tcl wiki链接的模板,此代码可用于处理 tcl 命令行参数。我想知道为什么我们需要[set argv {}]在第 7 行。

# 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]
}

4

1 回答 1

2

这看起来就像作者实现了K 的 Tcl wiki 页面上的“取消共享对象”部分中描述的性能优化。基本上它使对象不共享,因此修改不需要创建副本。在循环中操作大列表时,这可能会产生很大的不同。在这种情况下,我不希望它提供太多收益,因为 argv 通常不会很大并且它可能只处理一次。

于 2021-12-08T08:17:33.760 回答