tcl"switch -glob"与变量不匹配

X.M*_*.M. 1 glob tcl switch-statement

我在Solaris和Linux上都遇到过这个问题,tcl版本为8.3/8.4

请看以下代码:

#!/usr/bin/tclsh

set pattern "this is * and *"
set str "this is tcl and c++"

switch -glob $str {

  $pattern {
    puts "matched pattern"
  }
  "this is * and *" {
    puts "matched plain text"
  }
  default {
    puts "matched none"
  }

}
Run Code Online (Sandbox Code Playgroud)

结果是"匹配纯文本".我虽然应该匹配$ pattern ...这是不正确的switch用法,或者我没有为-glob选项提供正确的模式?

请有人给出一些想法,如果你能告诉如何修改代码以使其与switch和variable一起运行,那就更好了.

谢谢!XM

RHS*_*ger 7

我相信你误解了Tcl解析/替换是如何工作的.具体来说,glob命令获取参数:

1: -glob
2: $str
3: {

  $pattern {
    puts "matched pattern"
  }
  "this is * and *" {
    puts "matched plain text"
  }
  default {
    puts "matched none"
  }

}
Run Code Online (Sandbox Code Playgroud)

{...}构造将其中的内容"分组"为单个未替换(逐字)数据.因此,switch的第三个参数包含"$ pattern",而不是用模式变量的值替换$ pattern的结果.

如果你需要替换,你需要避免使用花括号(我正在简化).因此,如果您真的想要替换模式的值,最简单的方法是使用另一种形式的开关(它将每个模式/代码块作为单独的参数传递):

switch -glob $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}
Run Code Online (Sandbox Code Playgroud)

作为一个注释,当你使用变量替换字符串来匹配时,使用 - (没有更多标志)标志与开关几乎总是一个好主意.这可以避免您$str包含以a开头的内容的问题-

switch -glob -- $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}
Run Code Online (Sandbox Code Playgroud)