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
我相信你误解了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)
| 归档时间: |
|
| 查看次数: |
2054 次 |
| 最近记录: |