这可能是不可能的,但是有办法在tcl中传递正则表达式。 我有这个函数,我无法改变你在字符串中传递的内容,如果找到了某些东西并比较它们以确定它们是否相等。
proc check {a } {
// find b in the database
if {$a == $b} {
puts "equals"
} {
puts "Not equals"
}
}
问题是该函数使用'=='。这只是匹配,如果它们是准确的,但我需要在'a'中使用通配符,以便'a'和'b'相等,如果'a'和'b'以相同的单词开头。
答案 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
的定义之前运行该代码,您就会更改代码(不“更改代码”)并获得所需的功能。