日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

TCL腳本數(shù)據(jù)文件格式( 二 )


.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color} elseif { [regexp
{^text([0-9] )([0-9] )("[^"]*")([^ ] )(.*)$}
$line dummy x y txt anchor color] } {
.c create text $x $y -text $txt -anchor $anchor -fill $color} elseif { [regexp {^ *$} $line] } {
# Ignore blank lines} else {
puts "error: unknown keyWord."
}
}
close $fid我們一次讀取一行數(shù)據(jù),使用正則表達(dá)式查找該行代表的是某種數(shù)據(jù)類型.通過檢查第一個(gè)詞,我們可以區(qū)分代表長方形的數(shù)據(jù)和代表文本的數(shù)據(jù),所以第一個(gè)詞是一個(gè)關(guān)鍵字,它明確地告訴我們正在處理的是什么類型的數(shù)據(jù).同樣我們分析每個(gè)項(xiàng)目的坐標(biāo),顏色和其他屬性.括號(hào)中正則表達(dá)式的分組部分使我們找到變量"x1","x2"等的分析后的結(jié)果.
假如你知道正則表達(dá)式如何工作,這看上去是一個(gè)很簡(jiǎn)單的實(shí)現(xiàn).但我覺得它有點(diǎn)難以維護(hù),正則表達(dá)式也使其難以理解.
還有一個(gè)更簡(jiǎn)捷的解決方法,叫做“active file(主動(dòng)文件)”.原本由Nat Pryce在設(shè)計(jì)樣本時(shí)想到的 。這種方法基于一個(gè)非常簡(jiǎn)單的提議:與其用TCL自己來寫語法分析器(用regexp或其他途徑),干嘛不讓TCL的語法分析器為你做這些工作呢?
▲主動(dòng)文件設(shè)計(jì)樣本
為解釋這種設(shè)計(jì)樣本,我們繼續(xù)使用上節(jié)中那個(gè)簡(jiǎn)單的繪圖工具 。首先我們用TCL語言寫兩個(gè)過程,一個(gè)畫矩形,一個(gè)寫文本 。
example2/parser.tcl
canvas .c
pack .cproc d_rect {x1 y1 x2 y2 thickness color} {
.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color
}proc d_text {x y text anchor color} {
.c create text $x $y -text $text -anchor $anchor -fill $color
}現(xiàn)在要在畫布上繪圖,我們調(diào)用這兩個(gè)過程就行了,每次調(diào)用其中的一項(xiàng) 。比如要畫如前所述的圖形,需要下面三個(gè)調(diào)用 。
example2/datafile.dat
d_rect 10 10 150 50 2 blue
d_rect 7 7 153 53 2 blue
d_text 80 30 "Simple Drawing Tool" c red看上去眼熟嗎?調(diào)用過程的代碼看上去與先前我們分析的代碼幾乎完全一樣 。唯一的不同之處是關(guān)鍵詞由"rectangle"和"text"變成了"d_rect"和"d_text".
現(xiàn)在我們看到了寫樣本的技巧:為分析數(shù)據(jù)文件,我們要把它當(dāng)作一個(gè)TCL腳本來對(duì)待 。我們只把對(duì)我們寫好的過程的調(diào)用放到一個(gè)文件中,并用此文件作為數(shù)據(jù)文件.設(shè)計(jì)樣本的核心是數(shù)據(jù)文件實(shí)際上包含著對(duì)TCL過程的調(diào)用.
分析數(shù)據(jù)文件現(xiàn)在太容易了:
source "datafile.dat"內(nèi)建的TCL命令source讀取文件,分析并執(zhí)行文件中的命令.因?yàn)槲覀円呀?jīng)完成了d_rect和d_text過程,source命令將自動(dòng)以正確的參數(shù)調(diào)用這兩個(gè)過程.我們將d_rect和d_text稱為分析過程.
我們無需再做任何分析,不用正則表達(dá)式,不用一行一行地循環(huán),不用打開/關(guān)閉文件.只需調(diào)用source命令就完成了所有的工作 。
數(shù)據(jù)文件已經(jīng)成了可以執(zhí)行的TCL腳本.因?yàn)樗氖强蓤?zhí)行命令,而不僅僅是被動(dòng)的數(shù)據(jù),所以稱之為主動(dòng)文件.主動(dòng)文件在大多數(shù)腳本語言環(huán)境中均可正常運(yùn)行,在Nat Pryce的主頁上對(duì)其有詳細(xì)的描述.
▲使用主動(dòng)文件樣本的優(yōu)點(diǎn):
無需再寫一個(gè)分析程序,source調(diào)用TCL分析程序即可完成.
容易讀取數(shù)據(jù)文件格式.
使用主動(dòng)文件樣本的缺點(diǎn):
如果數(shù)據(jù)文件包含有危險(xiǎn)命令,象l -a exec rm *,它們執(zhí)行后會(huì)帶來嚴(yán)重的后果.解決這個(gè)問題的辦法是在安全模式下執(zhí)行主動(dòng)文件,防止危險(xiǎn)命令 。具體信息可參看TCL手冊(cè)中"安全解釋器"部分.
▲主動(dòng)文件樣本的局限
此樣本不是對(duì)所有可能的數(shù)據(jù)格式都有效.數(shù)據(jù)格式必須是以行為基礎(chǔ)的,每一行必須以一個(gè)關(guān)鍵字開頭.用關(guān)鍵字開頭寫TCL過程,就把被動(dòng)的關(guān)鍵字變成了主動(dòng)的命令 。這也意味著你不能使用象if或while之類的關(guān)鍵字,因?yàn)門CL不允許你用這樣的名字來寫過程.事實(shí)上,上面的例子中我把關(guān)鍵字改為d_text,就是因?yàn)殚_發(fā)工具包已經(jīng)有了保留字text,該命令用來創(chuàng)建文本工具.

推薦閱讀