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
您似乎在这里做出了两个错误的假设:
如果过程在其定义中不使用特殊参数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解释器程序的内容argc。argv
也就是说,当你调用类似的东西时
$ 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 2和foo 1 2 3 4 5 6not like foo x(因为正式参数没有价值b)。
在这样的过程中,您可以使用普通的列表命令(例如llength和lindex)来检查 中包含的内容args。例如,该调用foo 1 2 3 4 5 6将设置args为与通过调用 获得的值相同的值[list 3 4 5 6]。
| 归档时间: |
|
| 查看次数: |
15004 次 |
| 最近记录: |