TCL subst或eval命令在我的情况下不起作用。。
我想知道为什么上述案例对我不起作用。。subst命令应执行变量和命令替换。但是为什么我的变量不替换呢TCL subst或eval命令在我的情况下不起作用。。,tcl,Tcl,我想知道为什么上述案例对我不起作用。。subst命令应执行变量和命令替换。但是为什么我的变量不替换呢 有人能解释一下发生了什么吗?你把方括号放错地方了(在eval案例中你甚至不需要它们)。按照您编写命令的方式,sum{$a}{$b}]在subst或eval命令可以计算$a和$b的内容之前进行计算 正确答案是: subst or eval command is not working in my case .. % proc sum {a b} { return [expr $a+$b
有人能解释一下发生了什么吗?你把方括号放错地方了(在
eval
案例中你甚至不需要它们)。按照您编写命令的方式,sum{$a}{$b}]
在subst
或eval
命令可以计算$a
和$b
的内容之前进行计算
正确答案是:
subst or eval command is not working in my case ..
% proc sum {a b} {
return [expr $a+$b]
}
%
% set a 1
1
% set b 2
2
% sum $a $b
3
%
% sum {$a} {$b}
can't use non-numeric string as operand of "+"
%
% subst [sum {$a} {$b}]
can't use non-numeric string as operand of "+" >>>>>>>>> Why i am unable to substitue the value
%
% eval [sum {$a} {$b}]
can't use non-numeric string as operand of "+" >>>>>>>>> Why i am unable to substitue the value
%
或
您将方括号
[]
放错了位置(在eval
案例中甚至不需要它们)。按照您编写命令的方式,sum{$a}{$b}]
在subst
或eval
命令可以计算$a
和$b
的内容之前进行计算
正确答案是:
subst or eval command is not working in my case ..
% proc sum {a b} {
return [expr $a+$b]
}
%
% set a 1
1
% set b 2
2
% sum $a $b
3
%
% sum {$a} {$b}
can't use non-numeric string as operand of "+"
%
% subst [sum {$a} {$b}]
can't use non-numeric string as operand of "+" >>>>>>>>> Why i am unable to substitue the value
%
% eval [sum {$a} {$b}]
can't use non-numeric string as operand of "+" >>>>>>>>> Why i am unable to substitue the value
%
或
首先,您确实理解为什么“
$a
”不是一个可以添加的值?它根本不是一个数字。(我不是说$a
,从变量中读取并替换它的指令,我是指由一个$
后跟一个a
组成的字符串)
当您在Tcl中用大括号括起来时,它的意思是“不要对这个字符串做任何事情,按原样使用它”。始终(有时您将该字符串输入到一个进行计算的命令中,但不总是)当你用方括号括起来时,它意味着立即将字符串作为脚本进行计算,并使用脚本的结果作为替换值。始终
当您这样做时:
sum [subst {$a}] [subst {$b}]
您需要了解对sum
的调用是在将参数集合到subst
时完成的。该调用会产生错误,因此对subst
的调用永远不会发生。与您使用的eval
表单类似
如果我们使用一种不那么令人惊讶的形式:
subst [sum {$a} {$b}]
然后您会发现:sum{1}{2}
subst
无法将整个字符串理解为脚本。另一方面,使用:
subst {sum {$a} {$b}}
在这种情况下,您得到的错误并非来自eval
,而是来自对sum
inside的调用仍然是错误的
我想你可以做到:
eval {sum {$a} {$b}}
但事实并非如此。必须有一种更简单、更不容易出错的方法。首先,您确实理解为什么“
$a
”不是一个可以添加的值?它根本不是一个数字。(我不是指$a
,从变量中读取并替换它的指令,我是指由$
后跟a
组成的字符串)
当您在Tcl中用大括号括起来时,它的意思是“不要对这个字符串做任何事情,按原样使用它”。始终(有时您将该字符串输入到一个进行计算的命令中,但不总是)当你用方括号括起来时,它意味着立即将字符串作为脚本进行计算,并使用脚本的结果作为替换值。始终
当您这样做时:
sum [subst {$a}] [subst {$b}]
您需要了解对sum
的调用是在将参数集合到subst
时完成的。该调用会产生错误,因此对subst
的调用永远不会发生。与您使用的eval
表单类似
如果我们使用一种不那么令人惊讶的形式:
subst [sum {$a} {$b}]
然后您会发现:sum{1}{2}
subst
无法将整个字符串理解为脚本。另一方面,使用:
subst {sum {$a} {$b}}
在这种情况下,您得到的错误并非来自eval
,而是来自对sum
inside的调用仍然是错误的
我想你可以做到:
eval {sum {$a} {$b}}
但确实不需要。必须有一种更简单、更不容易出错的方法。您不能正确理解Tcl
subst
获取一个字符串并替换其中的所有变量,对吧。但是您将
sum{$a}{$b}
的结果传递给它,结果失败
因此,在调用sum
之前,您可以选择subst
每个参数:
eval [subst {sum {$a} {$b}}]
或修改总和,以便为您进行评估:
sum [subst {$a} {$b}]
expr
执行自己的一轮计算,这就是为什么您通常向它传递一个普通字符串(用{}
括起来),但在本例中,我们实际上使用了这个事实。uplevel
在调用方的上下文中执行命令
如果您调用命令,Tcl将在实际调用之前替换变量,因此此代码段可能有助于您更好地理解Tcl:
proc sum {a b} {
uplevel 1 [list expr $a + $b]
}
您没有正确理解Tcl
subst
获取一个字符串并替换其中的所有变量,对吧。但是您将
sum{$a}{$b}
的结果传递给它,结果失败
因此,在调用sum
之前,您可以选择subst
每个参数:
eval [subst {sum {$a} {$b}}]
或修改总和,以便为您进行评估:
sum [subst {$a} {$b}]
expr
执行自己的一轮计算,这就是为什么您通常向它传递一个普通字符串(用{}
括起来),但在本例中,我们实际上使用了这个事实。uplevel
在调用方的上下文中执行命令
如果您调用命令,Tcl将在实际调用之前替换变量,因此此代码段可能有助于您更好地理解Tcl:
proc sum {a b} {
uplevel 1 [list expr $a + $b]
}
sum[subst{$a}][subst{$b}]
是正确的方法。或者你可以做sum{$:a}{$:b}
一些惊喜,试试set c1;set d2;sum{$c}{$d}
。它会报告这个变量不存在。sum[subst{$a}][subst{$b}
是正确的方法。或者你可以做sum}:b}
要想获得一些惊喜,请尝试设置C1;设置D2;求和{$c}{$d}
。它将报告此变量不存在。