1

我在 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 匹配...这是开关的不正确使用,还是我没有为 -glob 选项提供正确的模式?

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

谢谢!XM

4

1 回答 1

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(将每个模式/代码块作为单独的参数传递):

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

需要注意的是,当您使用变量替换来匹配要匹配的字符串时,将 -- (不再有标志)标志与 switch 一起使用几乎总是一个好主意。这避免了您$str包含以 a 开头的内容的问题-

switch -glob -- $str $pattern {
    puts "matched pattern"
} "this is * and *" {
    puts "matched plain text"
} default {
    puts "matched none"
}
于 2010-07-16T03:59:42.227 回答