0
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 中生成错误无效的裸词“regexp”。

我想知道单词中的错误是什么,tcl.How to debug 中什么是无效的bareword。

4

2 回答 2

1

错误是regexp在 的第一个参数中写为非限定字符串if。如果要将命令的结果作为条件参数中的操作数,则需要在其周围加上括号:[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 模块的文档

文档:ifpackageprocputsset

于 2015-01-25T16:20:55.063 回答
1

它不是来自您的正则表达式。这是一个 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"
}

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

于 2015-01-25T15:25:45.770 回答