有没有办法在tcl中的'=='测试中使用通配符?

时间:2013-03-15 14:18:15

标签: tcl

这可能是不可能的,但是有办法在tcl中传递正则表达式。 我有这个函数,我无法改变你在字符串中传递的内容,如果找到了某些东西并比较它们以确定它们是否相等。

proc check {a } {
    // find b in the database
    if {$a == $b} {
        puts "equals"
    } {
        puts "Not equals"
    }   
 }

问题是该函数使用'=='。这只是匹配,如果它们是准确的,但我需要在'a'中使用通配符,以便'a'和'b'相等,如果'a'和'b'以相同的单词开头。

2 个答案:

答案 0 :(得分:3)

  

我有这个功能,我无法改变

为什么呢?在tcl中,您可以使用

轻松地重新定义它
proc check {a } {
    # find b in the database
    if {[string match -nocase $a $b]} {
        puts "equals"
    } {
        puts "Not equals"
    }   
}

或者您可以重新定义if,但不建议使用。

您甚至可以在运行时使用

搜索和替换if
proc check [info args check] [string map {
    {if {$a == $b}} {if {[string match -nocase $a $b]}}
} [info body check]]

那么:你为什么不能改变这个功能?

答案 1 :(得分:1)

==运算符的行为是固定的;它总是进行同等性测试。实际上它做了一个相等的测试,它更喜欢做数字相等,只有在没有别的办法时才会回到字符串相等。

因此,要更改check的行为,您必须真的棘手。


我会考虑使用执行跟踪拦截check内的某些内容,以便您可以在本地a变量上放置一个读取跟踪,这样当您阅读它时,实际上是值根据复杂的规则匹配。 (b可能只是为了布尔真值而持有1。)执行此操作的代码非常复杂,我实际上试图避免这样做!

如果可以的话,更容易重新定义proc,以便您可以在check的正文上添加前缀,以便在那里应用跟踪。甚至可以按摩测试本身。

# Rename the command to something that nothing else knows about (tricky!)
rename proc my_real_proc

my_real_proc proc {name arguments body} {
    # Replace a simple equality with a basic no-case pattern match
    if {$name eq "check"} {
        set body [string map {{$a == $b} {[string match -nocase $b $a]}} $body]
    }
    # Delegate to the original definition of [proc] for everything else
    uplevel my_real_proc $name $arguments $body
}

只要在check的定义之前运行该代码,您就会更改代码(不“更改代码”)并获得所需的功能。