A-A+

Tcl中表達式的替換規則

2019年07月21日 15:46:18 腳本 暫無評論 閱讀 0 views 次

在TCL中表達式操作數的替換方式有兩種,第一種是普通的TCL解析器機制,例如下面的命令:

% set x 0.5236

0.5236

% expr 2*sin($x)

1.0000021207252057

這裡TCL解析器會在執行命令前替換變量x的值,傳遞給expr的第一個參數的值類似于2*sin(0.5236)。

第二種方式則是通過表達式處理,在處理表達式時會再進行一輪變量替換和命令替換。例如:

expr {2*sin($x)}

這裡大括号阻止了TCL解析器替換x的值,因此傳給expr的參數是2*sin($x),當表達式處理器遇到$符号時,它自己會進行一次變量替換,把變量x的值作為參數傳給sin。當表達式處理器執行變量或命令替換時,替換的值必須是整數、實數或者字符串。這裡替換的值不能是任意的表達式。

有這樣兩層替換對expr命令的操作來說通常不會造成什麼不同,但是對于 while這樣會反複處理一個表達式,而各次處理所得的值不同的命令就有很大的影響了。例如下面這個腳本,該腳本尋找比指定的數大的、最小的2的幂。

set pow 1

while {$pow<$num} {

set pow [expr $pow*2]

}

表達式$pow<$num在每次疊代開始之前都要處理一次,判斷是否終止循環。該表達式在每次處理的時候都必須替換進pow的新值。如果沒有這個大括号,那這個替換就會在解析 while命時進行,那樣 while的第一個參數應該是常量表達式,這個循環要麼不進行,要麼就會進入死循環。

最好總是把表達式用大括号括起來,即使是在使用expr命令的時候,TCL處理括起來的表達式的效率大大高于處理沒有括起來的表達式的效率。把表達式用大括号括起來還能避免在代碼中出現一些難以捉摸的安全漏洞。考慮以下情況,程序提示用戶給出一個值,用戶輸入了一個表達式,例如

set x [expr $input +2]

如果一個惡意用戶在 Windows系統中輸入[ format C:\],那麼TCL解釋器會把這個字符串作為input變量,而表達式處理器會執行其中的命令一一格式化C盤。如果把這個表達式用括号括起來,表達式處理器會把它的值作為 input的值替換進來,這個值并不是一個有效的數學表達式,于是會産生一個錯誤。

本站微信公衆賬号,歡迎關注,如有問題可在下方留言也可在公衆賬号提問。

微信公衆賬号
标簽:

給我留言