2010-07-16 58 views
1

符合我遇到過這個問題在Solaris和Linux,與TCL版本8.3/8.4TCL 「開關-glob」 不變量

請參閱下面的代碼:

#!/usr/bin/tclsh 

set pattern "this is * and *" 
set str "this is tcl and c++" 

switch -glob $str { 

    $pattern { 
    puts "matched pattern" 
    } 
    "this is * and *" { 
    puts "matched plain text" 
    } 
    default { 
    puts "matched none" 
    } 

} 

和結果是「匹配純文本」。 我雖然它應該匹配$模式...這是一個錯誤的開關用法,或者我沒有給出正確的模式-glob選項?

請有人提供一些想法,它是更好的,如果你可以告訴如何修改代碼,使其與交換機和變量運行。

謝謝! XM

回答

7

我相信你誤解了Tcl解析/替換的工作原理。具體而言,命令水珠越來越的參數:

1: -glob 
2: $str 
3: { 

    $pattern { 
    puts "matched pattern" 
    } 
    "this is * and *" { 
    puts "matched plain text" 
    } 
    default { 
    puts "matched none" 
    } 

} 

的{...}構建體「基團」在它裏面的東西成一個單一的,未取代的(逐字)一段數據。因此,開關的第三個參數包含「$ pattern」,而不是使用模式變量的值替換$ pattern的結果。

如果您需要替換,您需要避免使用大括號(我正在簡化)。所以,如果你真的想替代值的格局,做到這一點是使用交換機的其他形式(這通過在每個圖案/代碼塊作爲單獨的參數)最簡單的方法:

switch -glob $str $pattern { 
    puts "matched pattern" 
} "this is * and *" { 
    puts "matched plain text" 
} default { 
    puts "matched none" 
} 

需要注意的是,當您使用變量替換來匹配字符串時,使用 - (不多於標誌)標誌與開關幾乎總是一個好主意。這避免了您的$str含有一種具有-

switch -glob -- $str $pattern { 
    puts "matched pattern" 
} "this is * and *" { 
    puts "matched plain text" 
} default { 
    puts "matched none" 
} 
+0

西格開始,感謝您的回答,它的工作原理和幫助的問題。你關於tcl腳本如何被替換的話也激發了很多。謝謝。 XM。 – 2010-07-19 00:45:34

+0

很高興我能幫到你。說實話,Tcl「分組」(引號與花括號)的「groke」往往是Tcl新手的最大絆腳石。如果你沒有得到它,你可能會走上漫長的道路,做出錯誤的決定,導致很多痛苦。如果你確實懂得了,幾乎所有其他的語言都很簡單。 – RHSeeger 2010-07-20 18:25:46