Полагаю, вы неправильно понимаете, как работает анализ / замена Tcl. В частности, команда glob получает аргументы:
1: -glob
2: $str
3: {
$pattern {
puts "matched pattern"
}
"this is * and *" {
puts "matched plain text"
}
default {
puts "matched none"
}
}
Конструкция {...} "группирует" вещи внутри него в один незамещенный (дословно) фрагмент данных. Таким образом, третий аргумент для переключения содержит «$ pattern», а не результат замены $ pattern значением переменной pattern.
Если вам нужна замена, вам следует избегать использования фигурных скобок (я упрощаю). Таким образом, если вы действительно хотите подставить значение для шаблона, самый простой способ сделать это - использовать другую форму переключателя (которая передается в каждом блоке шаблона / кода в качестве отдельного аргумента):
switch -glob $str $pattern {
puts "matched pattern"
} "this is * and *" {
puts "matched plain text"
} default {
puts "matched none"
}
Как примечание, почти всегда неплохо использовать флаг - (не более флагов) с параметром switch, когда вы используете подстановку переменной для соответствия строки. Это позволяет избежать проблемы, когда ваш $str
содержит что-то, начинающееся с -
switch -glob -- $str $pattern {
puts "matched pattern"
} "this is * and *" {
puts "matched plain text"
} default {
puts "matched none"
}