代码之家  ›  专栏  ›  技术社区  ›  user8086348

在tcl中设置char变量“-”

  •  1
  • user8086348  · 技术社区  · 7 年前

    我正在用tcl模拟用户对shell的输入

    if {$toOperand == 0} {
     set operand +
    } elseif {$toOperand == 1} {
     set operand -
    } elseif {$toOperand == 2} {
     set operand *
    } elseif {$toOperand == 3} {
    set operand :
    } elseif {$toOperand == 4} {
     set operand @
    } else {set operand #}
    

    除“-”外,所有字符都工作正常。以下是错误:

    ": must be -i, -h, -s, -null, -0, -raw, -break, or --
       while executing
    "send "$operand\r""
    

    感谢您的帮助

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Lewerin    7 年前

    答案是:

    插入a -- 操作数之前的伪选项,用于宣布后面没有更多选项。


    关于选择字符的说明:

    你的手机没有问题 if 构建,如果你对它满意,就应该使用它。不过,还有一些可能更紧凑、更容易阅读的替代方案。

    自从你 toOperand 变量保存看起来像列表索引的值,可以执行以下操作:

    set operands {+ - * : @}
    if {0 <= $toOperand && $toOperand < [llength $operands]} {
        set operand [lindex $operands $toOperand]
    } else {
        set operand #
    }
    

    这也是可行的(允许传递不匹配任何值的索引,它只会导致空字符串):

    set operands {+ - * : @}
    set operand [lindex $operands $toOperand]
    if {$operand eq {}} {
        set operand #
    }
    

    如果 toOperand公司 值不是直接的索引(不连续或非法的索引值),上述方法不起作用。类似的事情也可以用 dict (自 dict get 没有 允许使用不匹配的密钥,我们需要先检查密钥是否匹配):

    set operandValues {0 + 1 - 2 * 3 : 4 @}
    if {[dict exists operandValues $toOperand]} {
        set operand [dict get operandValues $toOperand]
    } else {
        set operand #
    }
    

    在这两种情况下,基本上都可以自由更改操作数集,而无需更改使用它的代码。

    另一种可能性是使用 switch 命令:

    switch $toOperand {
        0 {
            set operand +
        }
        1 {
            set operand -
        }
        2 {
            set operand *
        }
        3 {
            set operand :
        }
        4 {
            set operand @
        }
        default {
            set operand #
        }
    }
    

    文件: && (operator) ,则, < (operator) ,则, <= (operator) ,则, dict ,则, eq (operator) ,则, if ,则, lindex ,则, llength ,则, set ,则, switch