Tcl $argc 和 $argv 变量

Fla*_*ter 5 variables global tcl argv argc

我对 tcl 有点陌生,但我必须编写一个如下所示的过程:

proc TestVerb { Data Data_txt } {
VERBATIM [format "// Data: $Data - $Data_txt"]
if { $argc == 2} {
    VERBATIM {// SUCCESS //}
else {
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼这个过程:TestVerb Switch"This is used for..."

proc 位于不同的文件中,proc 调用位于另一个文件中。它们似乎来源正确,因为如果我不使用,我会得到所需的输出,$argc但一旦我使用其中一个$argv,或者$argc我收到以下编译错误:无法读取$argv/$argc没有这样的变量

如果我引用这个变量$::argc$::argv结果是不正确的。$argv为空且 $argc 为 0

kos*_*tix 2

您似乎在这里做出了两个错误的假设:

  • 如果过程在其定义中不使用特殊参数args(请参阅下文了解更多信息),则它仅接受固定数量的参数 - 与其定义中使用的参数数量完全匹配。每个调用都会由解释器进行检查,任何参数数量无效的调用在到达过程代码本身之前都会失败。

    你自己看:

    % proc foo {a b c} {}
    % foo
    wrong # args: should be "foo a b c"
    % foo 1
    wrong # args: should be "foo a b c"
    % foo 1 2 3 4
    wrong # args: should be "foo a b c"
    % foo 1 2 3
    %
    
    Run Code Online (Sandbox Code Playgroud)

    换句话说,不要试图检查传递给您的参数的数量proc:在调用您的过程时解释器已经检查了它。

  • 和全局变量控制从操作系统传递到正在执行 Tcl 脚本的 Tcl解释器程序的内容argcargv

    也就是说,当你调用类似的东西时

    $ tclsh myscript.tcl foo bar
    
    Run Code Online (Sandbox Code Playgroud)

    名为的变量argc将包含 2,并将argv被设置为包含两个字符串 —“foo”和“bar”的列表。

    换句话说,这些变量与各个程序无关。


关于args特殊参数:如果过程使用单词“args”作为其最后一个参数或将其作为唯一参数,则该参数将转换为消耗任意数量(包括零)实际参数的列表。

所以你可以做

proc foo {a b args} {}
Run Code Online (Sandbox Code Playgroud)

然后你的foo程序可以被称为 likefoo 1 2foo 1 2 3 4 5 6not like foo x(因为正式参数没有价值b)。

在这样的过程中,您可以使用普通的列表命令(例如llengthlindex)来检查 中包含的内容args。例如,该调用foo 1 2 3 4 5 6将设置args为与通过调用 获得的值相同的值[list 3 4 5 6]