【问题标题】:TCL, regexp function and parameter substitutionTCL、正则表达式函数和参数替换
【发布时间】:2012-07-05 21:40:49
【问题描述】:

我有以下代码,我试图通过 regexp 函数将单行上的数据匹配到不同的变量中。 regexp 函数中的数据数量(在输入行上)和变量名称可能会有所不同,这就是我使用 $varLine (之前在我的真实代码中处理过)的原因。

set in_stim "13 1 1 0 1 0 0 0 2 03"
set regex {^(\d+)\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s(\d+)\s(\d+)}
set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8"
regexp $regex $in_stim whole sig0 $varLine
puts "sig0: $sig0"
puts $sig1

当我执行它时,我得到以下错误($sig0 正确显示):

    sig0: 13

    can't read "sig1": no such variable
    while executing
"puts $sig1"

如果我手动将 $varLine 替换为正则表达式行,错误就会消失:

set in_stim "13 1 1 0 1 0 0 0 2 03"
set regex {^(\d+)\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s(\d+)\s(\d+)}
regexp $regex $in_stim whole sig0 sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8
puts $sig0
puts $sig1

我得到以下正确的输出:

13
1

有没有人看到我的代码中的错误或可以提供帮助? 谢谢!

【问题讨论】:

    标签: regex tcl substitution


    【解决方案1】:

    问题在于regexp 命令不会将用于存储子匹配的变量列表作为一个参数,而是作为多个参数。

    解决此问题的最简单方法是扩展变量列表:

    regexp $regex $in_stim whole sig0 {*}$varLine
    

    【讨论】:

      【解决方案2】:

      当你这样做时

      set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8"
      regexp $regex $in_stim whole sig0 $varLine
      

      Tcl 解析器传递regexp 命令恰好五个参数,第五个参数是变量“varLine”的内容,然后regexp 命令将其视为一个单词。一个词显然表示一个变量(在您的情况下,名称有点复杂,因为它发生了)。

      要做你需要的,你必须求助于动态脚本,这可以通过两种方式完成:

      1. 使用eval的“经典”方法:

        eval [concat [list regexp $regex $in_stim whole sig0] $varLine]
        
      2. 从 Tcl 8.5 开始使用 {*} 语法糖:

        regexp $regex $in_stim whole sig0 {*}$varLine
        

      经典方法首先通过连接两个列表来构造单词列表:命令的“静态”部分,然后是要传递给它的变量列表。然后构造的列表是evaluated 作为命令。您可以在this classic book 阅读更多相关信息。

      在新式方法中,{*} thingy 用于将 $varLine 的内容扩展为“就地”列表 — 请参阅第 5 条规则 here

      【讨论】:

      • 问题解决了!谢谢科斯蒂克斯!我猜它必须处理eval 指令,但我忘记了列表提示。我读过 {*} 但不明白,您的链接很完美!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2014-06-01
      • 2011-05-06
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多