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