【问题标题】:tcl "switch -glob" does not match with variabletcl "switch -glob" 与变量不匹配
【发布时间】:2010-07-16 02:28:41
【问题描述】:

我在 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 选项提供正确的模式?

请有人提供一些想法,如果您能告诉如何修改代码以使其与开关和变量一起运行,那就更好了。

谢谢! XM

【问题讨论】:

    标签: tcl switch-statement glob


    【解决方案1】:

    我相信您误解了 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(将每个模式/代码块作为单独的参数传递):

    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"
    }
    

    【讨论】:

    • Seeger,感谢您的回答,它有效且有帮助。您关于如何替换 tcl 脚本的话也很有启发性。谢谢你。 XM。
    • 很高兴我能帮上忙。老实说,对于那些刚接触 Tcl 的人来说,“groking” Tcl “分组”(引号与花括号)往往是最大的绊脚石。如果你不明白,你可能会走上漫长的错误道路,导致很多痛苦。如果你真的明白了,那么该语言中的几乎所有其他内容都非常简单。
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多