Tcl語(yǔ)言中有三類(lèi)置換:變量置換、命令置換和反斜杠置換??梢哉f(shuō)“置換”是Tcl的靈魂,同時(shí)也是讓初學(xué)者容易感到困惑的一個(gè)難點(diǎn)。很多初學(xué)者常會(huì)碰到這樣的情形:不希望發(fā)生置換時(shí)卻發(fā)生了或者希望發(fā)生置換時(shí)卻沒(méi)有發(fā)生,加之一些Tcl解釋器調(diào)試功能欠佳,往往讓初學(xué)者受挫,覺(jué)得自己的腳本發(fā)生了詭異的行為。實(shí)際上,Tcl的置換機(jī)制很簡(jiǎn)單,其行為也很容易預(yù)測(cè),只需記住如下兩條規(guī)則:
規(guī)則1:Tcl在解析一條命令時(shí),只從左向右解析一次,進(jìn)行一輪置換,每一個(gè)字符只會(huì)被掃描一次;
規(guī)則2:每一個(gè)字符只會(huì)發(fā)生一層置換,而不會(huì)對(duì)置換后的結(jié)果再進(jìn)行一次掃描置換
看一個(gè)典型的例子,在這個(gè)例子中,變量x被賦值為10,變量a被賦值為字符x。之后,給變量b賦值$$a。根據(jù)上述規(guī)則,Tcl從左向右對(duì)命令”set b $$a”進(jìn)行解析,掃描所有的字符,發(fā)現(xiàn)$$a時(shí),執(zhí)行變量置換,得到$x,同時(shí)只發(fā)生一層置換,不會(huì)對(duì)置換后的結(jié)果$x再進(jìn)行掃描置換(否則$$a中最左側(cè)也就是第一個(gè)$將被掃描兩次,與規(guī)則1沖突,)。因此,最左側(cè)的$并不會(huì)觸發(fā)變量置換,最終變量b的值將會(huì)是$x,而不是10。
根據(jù)上述兩個(gè)規(guī)則,理解如下腳本的執(zhí)行結(jié)果。
從Tcl代碼風(fēng)格的角度看,應(yīng)盡可能地將置換簡(jiǎn)單化,這意味著盡可能地將多層次嵌套的置換分解為更簡(jiǎn)單的層次置換,這可通過(guò)命令分解實(shí)現(xiàn)。同時(shí)避免在同一條命令中出現(xiàn)太多的置換,尤其避免出現(xiàn)太多復(fù)雜的不同類(lèi)型的置換,這對(duì)代碼維護(hù)十分不利。此外,值得考慮的方法是建立“過(guò)程”,將復(fù)雜的操作隔離開(kāi)來(lái),從而增強(qiáng)代碼的可讀性和可維護(hù)性??催@樣一個(gè)例子,計(jì)算兩個(gè)字符串的總長(zhǎng)度,這里用到了三個(gè)命令:set、expr和stringlength。在計(jì)算str_len時(shí),使用了變量置換和命令置換,同時(shí)出現(xiàn)了命令嵌套。
對(duì)比另一種寫(xiě)法,將嵌套拆分,代碼的可讀性便躍然紙上。
結(jié)論:
Tcl在解析一條命令時(shí)
-每個(gè)字符只會(huì)被掃描一次
-每個(gè)字符只會(huì)發(fā)生一層置換
-
TCL
+關(guān)注
關(guān)注
10文章
1743瀏覽量
88902 -
置換
+關(guān)注
關(guān)注
0文章
3瀏覽量
2035
原文標(biāo)題:深入理解Tcl中的置換
文章出處:【微信號(hào):Lauren_FPGA,微信公眾號(hào):FPGA技術(shù)驛站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
深入理解和實(shí)現(xiàn)RTOS_連載
深入理解和實(shí)現(xiàn)RTOS_連載
深入理解STM32
對(duì)棧的深入理解
為什么要深入理解棧
深入理解應(yīng)用廣泛的QMatrix 技術(shù)
老司機(jī)帶你深入理解ST庫(kù)中的 assert_param 語(yǔ)句
深入理解深度學(xué)習(xí)中的反(轉(zhuǎn)置)卷積
![<b class='flag-5'>深入理解</b>深度學(xué)習(xí)<b class='flag-5'>中</b>的反(轉(zhuǎn)置)卷積](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論