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

有没有办法在';中使用通配符==';在tcl中测试?,tcl,Tcl,这可能不可能,但有一种方法可以在tcl中传递正则表达式。 我有一个函数,我不能改变你在字符串中传递的值,如果你找到了一些东西并比较它们,看它们是否相等 proc check {a } { // find b in the database if {$a == $b} { puts "equals" } { puts "Not equals" } } 问题是函数使用了“==”。这只在精确的情况下匹配,但是我需要在“a”中有通

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

proc check {a } {
    // find b in the database
    if {$a == $b} {
        puts "equals"
    } {
        puts "Not equals"
    }   
 }
问题是函数使用了“==”。这只在精确的情况下匹配,但是我需要在“a”中有通配符,这样如果“a”和“b”以相同的单词开头,那么“a”和“b”是相等的

我有这个功能,我不能改变

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

proc check {a } {
    # find b in the database
    if {[string match -nocase $a $b]} {
        puts "equals"
    } {
        puts "Not equals"
    }   
}
或者,如果,您也可以重新定义
,但不建议这样做

您甚至可以在运行时用

proc check [info args check] [string map {
    {if {$a == $b}} {if {[string match -nocase $a $b]}}
} [info body check]]
那么:为什么你不能改变这个函数呢

我有这个功能,我不能改变

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

proc check {a } {
    # find b in the database
    if {[string match -nocase $a $b]} {
        puts "equals"
    } {
        puts "Not equals"
    }   
}
或者,如果
,您也可以重新定义
,但不建议这样做

您甚至可以在运行时用

proc check [info args check] [string map {
    {if {$a == $b}} {if {[string match -nocase $a $b]}}
} [info body check]]

那么:为什么不能更改函数?

操作符的行为是固定的;它总是进行平等性测试。事实上,它做了一个等式测试,它更喜欢做数字等式,只有在没有其他方法的情况下才返回到字符串等式

因此,要更改
check
的行为,您必须非常棘手


我将研究如何使用执行跟踪来截取
check
中的某些内容,这样您就可以在本地
变量上放置一个读取跟踪,这样当您读取它时,您就可以根据复杂的规则得到它的值是否与某些内容匹配。(
b
可能只需将a
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
之前运行该代码,就可以更改代码(无需“更改代码”)并获得所需的功能。

操作符的行为是固定的;它总是进行平等性测试。事实上,它做了一个等式测试,它更喜欢做数字等式,只有在没有其他方法的情况下才返回到字符串等式

因此,要更改
check
的行为,您必须非常棘手


我将研究如何使用执行跟踪来截取
check
中的某些内容,这样您就可以在本地
变量上放置一个读取跟踪,这样当您读取它时,您就可以根据复杂的规则得到它的值是否与某些内容匹配。(
b
可能只需将a
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
}

只要在
检查定义之前运行该代码,您就可以更改代码(无需“更改代码”)并获得所需的功能。

不能更改/不允许更改的是遗留代码OK,总结一下:您有需要更改
检查的任务,但是你是不允许这样做的。这意味着你不能成功地完成这项任务。考虑我的帖子中的热点,也许其中一个是允许的;不能更改/不允许更改的是遗留代码OK,总结一下:您有需要更改的任务
检查
,但不允许您这样做。这意味着你不能成功地完成这项任务。考虑我的帖子中的热点,也许其中一个是允许的;如果你替换一种语言的原语(在Tcl中,这样做很容易),你可以让每个程序都做你想做的事情,而不必碰那段代码。如果你替换一种语言的原语(在Tcl中,这样做很容易),你可以让每个程序都做你想做的事情,而不必碰那段代码。