ZetCode

Tcl switch 命令

最后修改于 2025 年 4 月 3 日

Tcl 的 switch 命令提供基于模式匹配的多路分支。与多个 if-else 语句相比,当测试单个值与多种可能性时,它更有效。

基本定义

switch 命令评估一个表达式并将其与模式进行匹配以执行相应的脚本。它支持精确匹配、glob 风格匹配和 regexp 匹配。

语法:switch ?options? string pattern body ?pattern body ...?。该命令将 string 与每个 pattern 进行比较,并执行第一个匹配的 body

基本精确匹配

此示例演示了使用 switch 命令进行简单的精确匹配。

basic_switch.tcl
set day "Tuesday"

switch $day {
    "Monday"    { puts "Start of work week" }
    "Tuesday"   { puts "Second day" }
    "Wednesday" { puts "Midweek" }
    "Thursday"  { puts "Almost Friday" }
    "Friday"    { puts "Weekend coming" }
    default     { puts "Weekend day" }
}

该脚本将 day 的精确值与模式进行匹配。当找到“Tuesday”时,它会执行相应的 bodydefault 情况处理任何不匹配的值。

Glob 风格模式匹配

此示例展示了如何使用 -glob 选项的 glob 风格模式。

switch_glob.tcl
set filename "report2023.pdf"

switch -glob $filename {
    "*.txt"   { puts "Text file" }
    "*.pdf"   { puts "PDF document" }
    "*.jpg"   { puts "JPEG image" }
    "report*" { puts "Report file" }
    default   { puts "Unknown file type" }
}

-glob 选项启用 glob 风格模式匹配。该脚本匹配“.pdf”扩展名和“report”前缀模式。仅执行第一个匹配模式的 body

正则表达式匹配

此示例演示了使用 -regexp 选项的 regex 模式匹配。

switch_regex.tcl
set input "user123"

switch -regexp $input {
    "^[a-z]+$"       { puts "All letters" }
    "^[0-9]+$"       { puts "All digits" }
    "^[a-z]+[0-9]+$" { puts "Letters followed by digits" }
    "^[0-9]+[a-z]+$" { puts "Digits followed by letters" }
    default          { puts "No match" }
}

-regexp 选项启用正则表达式匹配。该脚本匹配“字母后跟数字”的模式并执行相应的 body。Regex 模式提供了强大的匹配功能。

贯穿行为

此示例显示了如何使用 - 标记来实现贯穿行为。

switch_fallthrough.tcl
set number 3

switch $number {
    1       { puts "One" }
    2       -
    3       { puts "Two or Three" }
    4       { puts "Four" }
    default { puts "Other number" }
}

- 标记允许多个模式执行相同的 body。这里 2 和 3 都执行“Two or Three” body。这对于将相似的情况分组非常有用。

使用大括号作为模式

此示例演示了如何使用大括号作为模式以防止进行替换。

switch_braces.tcl
set value "red"

switch $value {
    red     { set color_code "#FF0000" }
    green   { set color_code "#00FF00" }
    blue    { set color_code "#0000FF" }
    default { set color_code "#000000" }
}

puts "Color code for $value is $color_code"

模式被包含在大括号中,以防止任何替换或解释。这是在 Tcl 中编写 switch 命令最常见的方式。大括号确保模式被视为字面量。

嵌套 Switch 命令

此示例展示了如何嵌套 switch 命令以实现复杂逻辑。

switch_nested.tcl
set category "fruit"
set item "apple"

switch $category {
    "fruit" {
        switch $item {
            "apple"  { puts "It's an apple" }
            "banana" { puts "It's a banana" }
            default  { puts "Unknown fruit" }
        }
    }
    "vegetable" {
        switch $item {
            "carrot" { puts "It's a carrot" }
            "potato" { puts "It's a potato" }
            default  { puts "Unknown vegetable" }
        }
    }
    default { puts "Unknown category" }
}

嵌套的 switch 命令允许进行分层决策。外部 switch 处理类别,而内部 switch 处理每个类别中的特定项。这种结构使复杂逻辑保持有序。

最佳实践

本教程涵盖了 Tcl switch 命令,并通过实际示例展示了其在不同场景下的用法。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Tcl 教程