我对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
答案 0 :(得分:1)
argc
和argv
变量是全局变量(当它们具有任何特殊含义时)。在一个程序中,除非你说:
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
的参数数量:解释程序在调用程序时已经检查过它。
argc
和argv
个全局变量控制从操作系统传递到执行Tcl脚本的Tcl解释器程序的内容。
也就是说,当你打电话给
时$ tclsh myscript.tcl foo bar
名为argc
的变量将包含2,argv
将设置为包含两个字符串的列表 - “foo”和“bar”。
换句话说,这些变量与个别程序无关。
关于args
特殊参数:如果一个过程使用单词“args”代表其参数的最后一个或者将它作为唯一参数,则该参数将变为消耗任何数量(包括零)实际参数的列表。
所以你可以做到
proc foo {a b args} {}
然后您的foo
程序可以像foo 1 2
和foo 1 2 3 4 5 6
一样调用,但不像foo x
那样(因为b
正式没有价值参数)。
在这样的过程中,您使用普通列表命令(如llength
和lindex
)来检查args
中包含的内容。例如,通话foo 1 2 3 4 5 6
会将args
设置为您通过调用[list 3 4 5 6]
获得的相同值。
答案 2 :(得分:0)
如上所述,argv
和argc
并不引用本地过程参数,
默认情况下,Tcl proc中的参数数量是固定的。如果要使用变量列表,可以编写args
:
proc TestVerb {args} {}
args
可被视为普通列表。如果要测试参数数量,可以使用llength
并使用lassign
拆分参数列表:
proc TestVerb {args} {
if {[llength $args] != 2} {
message
return
}
lassign $args Data Data_txt
....
}