Tcl 条件运算符中关闭引号后的额外字符

Tcl 条件运算符中关闭引号后的额外字符,tcl,Tcl,我正在使用条件运算符,但得到错误“关闭引号后的额外字符”。fdx是一个参数,我正在尝试传递函数参数,我正在检查传递的参数是否为“fdx”,并基于此确定要写入的值 proc set_ifg_seville2 {port sgmii speed fdx} { case $speed { 10 { erf_wr -s dev_$port mac_ifg_cfg tx_ifg [expr ($fdx == "fdx") ? 5:4] } }

我正在使用条件运算符,但得到错误“关闭引号后的额外字符”。fdx是一个参数,我正在尝试传递函数参数,我正在检查传递的参数是否为“fdx”,并基于此确定要写入的值

    proc set_ifg_seville2 {port sgmii speed fdx} {
   case $speed {
    10 {
        erf_wr -s dev_$port mac_ifg_cfg tx_ifg [expr ($fdx == "fdx") ? 5:4]

      }

    } #Closing procedure

代码中三元运算的表达式应更改为

erf_wr -s dev_$port mac_ifg_cfg tx_ifg [expr {$fdx == "fdx" ? 5:4}]
示例:

% set fdx "fdx"
fdx
% set result [expr {$fdx=="fdx" ? "pass" : "fail" }]
pass
% set result [expr {$fdx=="stackoverflow" ? "pass" : "fail" }]
fail
%

参考:

代码中三元运算的表达式应更改为

erf_wr -s dev_$port mac_ifg_cfg tx_ifg [expr {$fdx == "fdx" ? 5:4}]
示例:

% set fdx "fdx"
fdx
% set result [expr {$fdx=="fdx" ? "pass" : "fail" }]
pass
% set result [expr {$fdx=="stackoverflow" ? "pass" : "fail" }]
fail
%

参考:

您是否用括号“}”关闭了您的程序集?你结案了吗?我猜用户3565150在这里打错了。实际上,OP已正确关闭
proc
。因为,如果没有该OP,则会出现
缺少右大括号
的错误消息。问题是,由于没有对传递给
expr
的表达式进行大括号,因此它将作为一系列Tcl参数进行计算。以引号开头的参数必须以引号结尾,而不是像代码中那样以括号结尾。括号前的空格可以解决此问题,但支撑表达式更好。另外,
case
命令已被弃用,并可能在未来版本的Tcl中消失:请改用
switch
命令。
case
?哇,真是老派的东西。切换到
Switch
…哪个版本的Tcl有
case
命令?您是否关闭了您的程序集_ifg_seville2,并用括号“}”?你结案了吗?我猜用户3565150在这里打错了。实际上,OP已正确关闭
proc
。因为,如果没有该OP,则会出现
缺少右大括号
的错误消息。问题是,由于没有对传递给
expr
的表达式进行大括号,因此它将作为一系列Tcl参数进行计算。以引号开头的参数必须以引号结尾,而不是像代码中那样以括号结尾。括号前的空格可以解决此问题,但支撑表达式更好。另外,
case
命令已被弃用,并可能在未来版本的Tcl中消失:请改用
switch
命令。
case
?哇,真是老派的东西。切换到
Switch
…哪个版本的Tcl有
case
命令?并扩展示例:
expr($fdx==“fdx”)?“pass”:“fail”
导致错误
无效的裸字“fdx”
,因为在将参数提供给expr命令之前,Tcl解析器会删除双引号。为了扩展示例:
expr($fdx==“fdx”)?“pass”:“fail”
会导致错误
无效的裸字“fdx”
,因为在将参数提供给expr命令之前,Tcl解析器会删除双引号。