tcl";开关-glob";与变量不匹配

tcl";开关-glob";与变量不匹配,tcl,switch-statement,glob,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" }

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

我相信您误解了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变量的值替换$pattern的结果

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

需要注意的是,在使用变量替换字符串进行匹配时,使用--(无更多标志)标志和开关几乎总是一个好主意。这避免了
$str
包含以
-
开头的内容的问题

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

我相信您误解了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变量的值替换$pattern的结果

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

需要注意的是,在使用变量替换字符串进行匹配时,使用--(无更多标志)标志和开关几乎总是一个好主意。这避免了
$str
包含以
-
开头的内容的问题

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

Seeger,谢谢你的回答,它很有用。您关于tcl脚本如何被取代的言论也启发了很多人。非常感谢。很高兴我能帮上忙。老实说,“摸索”Tcl分组(引号和花括号)往往是Tcl新手的最大绊脚石。如果你不明白,你可能会在漫长的道路上犯错,导致很多痛苦。如果你真的明白了,语言中几乎所有的东西都很简单。Seeger,谢谢你的回答,它很有用。您关于tcl脚本如何被取代的言论也启发了很多人。非常感谢。很高兴我能帮上忙。老实说,“摸索”Tcl分组(引号和花括号)往往是Tcl新手的最大绊脚石。如果你不明白,你可能会在漫长的道路上犯错,导致很多痛苦。如果你真的明白了,语言中几乎所有的东西都很简单。