0

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

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

问题是该函数使用'=='。这仅在它们完全匹配时才匹配,但我需要在“a”中有通配符,以便如果“a”和“b”以相同的单词开头,“a”和“b”是相等的。

4

2 回答 2

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]]

那么:为什么不能改变功能呢?

于 2013-03-15T14:36:45.227 回答
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,您就会更改代码(无需“更改代码”)并获得您想要的功能。

于 2013-03-15T15:18:39.720 回答