【问题标题】:‘Invalid bare word "regexp"’ in Tcl scriptTcl 脚本中的“无效的裸词“regexp””
【发布时间】:2015-01-25 14:26:17
【问题描述】:
proc mulval { addr } {

if {regexp {^([2][2-3][0-9])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.+(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$} $addr } {
        puts "Valid IP Multicast Address"
    } else { 
        puts"Invalid IP multicast Address"
    }

}

以上代码在tcl中生成错误invalid bareword "regexp"。

我想知道单词中的错误是什么,tcl中什么是无效的bareword。如何调试。

【问题讨论】:

  • regex101.com/r/rG7gX4/27 正则表达式是正确的。检查其他的东西
  • 你的\.+应该是\.。否则它将匹配225.....255.255.0

标签: regex tcl bareword


【解决方案1】:

错误在于regexpif 的第一个参数中被写为非限定字符串。如果你想将命令的结果作为条件参数中的操作数,你需要在它周围加上括号:[regexp ...]

但您不应该使用正则表达式来验证 IP 号码。点分十进制只是编写 IP 编号的众多可能方法之一,尝试使用正则表达式对其进行排序会很痛苦且容易出错。

改用ip 模块。我不是知识产权专家,但以下应该可以:

package require ip

proc mulval addr {
    set mc [::ip::prefix 224/4]

    if {[::ip::equal $mc [::ip::prefix $addr/4]]} {
        puts "Valid IP Multicast Address" 
    } else { 
        puts "Invalid IP multicast Address"
    }
}

Tcllib ip module 的文档

文档:ifpackageprocputsset

【讨论】:

    【解决方案2】:

    它不是来自您的正则表达式。这是一个 Tcl 语法问题。你应该写:

    if { [ regexp {^([2][2-3][0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$} $addr ] } {
        puts  "Valid IP Multicast Address" 
    } else { 
        puts  "Invalid IP multicast Address"
    }
    

    方括号表示内容必须被视为可执行命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多