Tcl $ argc和$ argv变量

时间:2015-01-28 15:13:52

标签: variables tcl global argv argc

我对tcl有点新意,但我必须写一个看起来像这样的proc:

proc TestVerb { Data Data_txt } {
VERBATIM [format "// Data: $Data - $Data_txt"]
if { $argc == 2} {
    VERBATIM {// SUCCESS //}
else {
    exit 1
}

我这样称为proc:TestVerb Switch"This is used for..."

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

如果我使用$argv/$argc$::argc引用此变量,则结果不正确。 $::argv为空,$ argc为0

3 个答案:

答案 0 :(得分:1)

argcargv变量是全局变量(当它们具有任何特殊含义时)。在一个程序中,除非你说:

,否则它们并非特别
global argc argv

或使用完全限定版本。

使用您的过程,您将收到一条错误消息(由过程调用机制生成),除非您传入正确数量的参数。您不需要自己检查(除非您使用带有默认值的正式参数或特殊args变量 - 请注意拼写 - 在形式参数的末尾。

要获取传递给过程的参数的确切列表,请使用:

set allArguments [info level 0]

您通常不需要它。在声明您的程序时,肯定不需要它:

proc TestVerb { Data Data_txt } {
    ...
}

答案 1 :(得分:1)

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

  • 如果proc在其定义中没有使用特殊参数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
    %
    

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

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

    也就是说,当你打电话给

    $ tclsh myscript.tcl foo bar
    

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

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


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

所以你可以做到

proc foo {a b args} {}

然后您的foo程序可以像foo 1 2foo 1 2 3 4 5 6一样调用,但不像foo x那样(因为b正式没有价值参数)。

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

答案 2 :(得分:0)

如上所述,argvargc并不引用本地过程参数, 默认情况下,Tcl proc中的参数数量是固定的。如果要使用变量列表,可以编写args

proc TestVerb {args} {}

args可被视为普通列表。如果要测试参数数量,可以使用llength并使用lassign拆分参数列表:

proc TestVerb {args} {
    if {[llength $args] != 2} {
        message
        return
    }
    lassign $args Data Data_txt
    ....
}