2013-03-15 87 views
0

這可能是不可能的,但有沒有辦法在tcl中傳遞正則表達式。 我有這個功能,我不能改變你在一個字符串中傳遞的東西,如果發現一些東西並比較它們,看看它們是否相等。有沒有一種方法可以在tcl的'=='測試中使用通配符?

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

問題是該函數使用'=='。這隻在匹配的情況下才是準確的,但我需要在'a'中使用通配符,以便'a'和'b'以相同的單詞開始時'a'和'b'相等。

回答

3

我有這個功能,我不能改變

爲什麼?在TCL,你可以很容易地

proc check {a } { 
    # find b in the database 
    if {[string match -nocase $a $b]} { 
     puts "equals" 
    } { 
     puts "Not equals" 
    } 
} 

重新定義或者你可以重新定義if,但不建議使用。

你甚至可以搜索並與

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

所以更換if線在運行時:你爲什麼不能改變功能?

+0

它是遺留的代碼,不能更改/不允許更改 – user2043469 2013-03-15 14:40:03

+0

好的,總結:你有任務需要改變'check',但你不能這樣做。這意味着您無法成功完成此任務。 – 2013-03-15 14:44:07

+0

想到儘可能多 – user2043469 2013-03-15 14:50:37

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定義之前運行的代碼,你會改變的代碼(沒有「更改代碼」),並得到你想要的那種能力。

+1

如果你替換語言的原語(和在Tcl中,這樣的事情很容易),你可以讓每個程序做到這一點你不想觸摸那個代碼。 – 2013-03-15 19:32:34

相關問題