忽视-&引用;在Tcl

忽视-&引用;在Tcl,tcl,Tcl,我正在写一个代码,当它检测到字符串中的“-”时,它会做某事。当我这样做时: switch [string index $code $j] { "-" { set mem($ptr) [expr $mem($ptr) - 1] ; } 但Tcl将其解释为“-”作为开关选项前缀: bad option "-": must be -exact, -glob, -regexp, -command procname or -- 我试图用另一个字符替换“-”: regsub -all "-" $

我正在写一个代码,当它检测到字符串中的“-”时,它会做某事。当我这样做时:

switch [string index $code $j] {
    "-" { set mem($ptr) [expr $mem($ptr) - 1] ; }
但Tcl将其解释为“-”作为
开关
选项前缀:

bad option "-": must be -exact, -glob, -regexp, -command procname or --
我试图用另一个字符替换“-”:

regsub -all "-" $code "m" code
但这是一样的:

bad switch "-": must be -all, -nocase, -expanded, -line, -linestop, -lineanchor, -start, or --
甚至在我使用
\u2d
时也会发生这种情况:

regsub -all \u2d $code "m" code
switch $code \u2d {puts "hi" ;}

这是一个已知的问题,为了解决这个问题,引入了特殊选项
--
。这意味着交换机结束,意味着在
--
之后将没有其他交换机,将下一个令牌视为数据

因此,如果您只使用

switch -- [string index $code $j] {
    "-" {set mem($ptr) [expr $mem($ptr) - 1]}
}

这是一个已知的问题,为了解决这个问题,引入了特殊选项
--
。这意味着交换机结束,意味着在
--
之后将没有其他交换机,将下一个令牌视为数据

因此,如果您只使用

switch -- [string index $code $j] {
    "-" {set mem($ptr) [expr $mem($ptr) - 1]}
}

另一个修正是升级到8.6,如果
开关只有两个参数,它就不会将其中任何一个作为选项(因为从一开始这总是一件非常麻烦的事情)。另一个修正是升级到8.6,如果
开关只有两个参数,它就不会将任何一个作为选项(因为从一开始这总是一件非常烦人的事情。)每日提示:不要使用
set mem($ptr)[expr$mem($ptr)-1]
,而是使用
incr mem($ptr)-1
。如果你不这样做,至少要使用以下表达式:
expr{$mem($ptr)-1}
。每日提示:不要使用
set mem($ptr)[expr$mem 1]
,使用
incr mem($ptr)-1
。如果不使用,请至少用括号括起表达式:
expr{$mem($ptr)-1}