有没有办法在';中使用通配符==';在tcl中测试?
这可能不可能,但有一种方法可以在tcl中传递正则表达式。 我有一个函数,我不能改变你在字符串中传递的值,如果你找到了一些东西并比较它们,看它们是否相等有没有办法在';中使用通配符==';在tcl中测试?,tcl,Tcl,这可能不可能,但有一种方法可以在tcl中传递正则表达式。 我有一个函数,我不能改变你在字符串中传递的值,如果你找到了一些东西并比较它们,看它们是否相等 proc check {a } { // find b in the database if {$a == $b} { puts "equals" } { puts "Not equals" } } 问题是函数使用了“==”。这只在精确的情况下匹配,但是我需要在“a”中有通
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
可能只需将a1
用于布尔真值)执行此操作的代码非常复杂,我真的会尽量避免执行此操作
如果可以的话,更简单的方法是重新定义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
可能只需将a1
用于布尔真值)执行此操作的代码非常复杂,我真的会尽量避免执行此操作
如果可以的话,更简单的方法是重新定义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中,这样做很容易),你可以让每个程序都做你想做的事情,而不必碰那段代码。