深入理解Tcl中的置換

  • 2019 年 10 月 31 日
  • 筆記

Tcl語言中有三類置換:變數置換(點擊這裡複習:變數置換)、命令置換(點擊這裡複習:命令置換)和反斜杠置換(點擊這裡複習:反斜杠置換)。可以說「置換」是Tcl的靈魂,同時也是讓初學者容易感到困惑的一個難點。很多初學者常會碰到這樣的情形:不希望發生置換時卻發生了或者希望發生置換時卻沒有發生,加之一些Tcl解釋器調試功能欠佳,往往讓初學者受挫,覺得自己的腳本發生了詭異的行為。實際上,Tcl的置換機制很簡單,其行為也很容易預測,只需記住如下兩條規則:

規則1:Tcl在解析一條命令時,只從左向右解析一次,進行一輪置換,每一個字元只會被掃描一次;

規則2:每一個字元只會發生一層置換,而不會對置換後的結果再進行一次掃描置換

看一個典型的例子,在這個例子中,變數x被賦值為10,變數a被賦值為字元x。之後,給變數b賦值$$a。根據上述規則,Tcl從左向右對命令」set b $$a」進行解析,掃描所有的字元,發現$$a時,執行變數置換,得到$x,同時只發生一層置換,不會對置換後的結果$x再進行掃描置換(否則$$a中最左側也就是第一個$將被掃描兩次,與規則1衝突,)。因此,最左側的$並不會觸發變數置換,最終變數b的值將會是$x,而不是10。

根據上述兩個規則,理解如下腳本的執行結果。

從Tcl程式碼風格的角度看,應儘可能地將置換簡單化,這意味著儘可能地將多層次嵌套的置換分解為更簡單的層次置換,這可通過命令分解實現。同時避免在同一條命令中出現太多的置換,尤其避免出現太多複雜的不同類型的置換,這對程式碼維護十分不利。此外,值得考慮的方法是建立「過程」,將複雜的操作隔離開來,從而增強程式碼的可讀性和可維護性。看這樣一個例子,計算兩個字元串的總長度,這裡用到了三個命令:set、expr和stringlength。在計算str_len時,使用了變數置換和命令置換,同時出現了命令嵌套。

對比另一種寫法,將嵌套拆分,程式碼的可讀性便躍然紙上。

結論:

Tcl在解析一條命令時

-每個字元只會被掃描一次

-每個字元只會發生一層置換