tcl“switch -glob”与变量不匹配

时间:2010-07-16 02:28:42

标签: tcl switch-statement glob

我在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"
  }

}

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

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

谢谢! XM

1 个答案:

答案 0 :(得分:7)

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

1: -glob
2: $str
3: {

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

}

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

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

switch -glob $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}

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

开头的内容的问题
switch -glob -- $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}