2014-03-05 46 views
0

如何組織一個使用TCL的循環來搜索列表的每個元素是否存在於文件或其他列表中,如果不存在則返回不匹配的元素。如何在文件中搜索列表中的每個元素的存在

+0

你能澄清你的問題嗎?我不明白你想要做什麼。任何例子? – Jerry

+0

我有2個文件:file1,file2。 file1的長度 user3383125

+0

好吧,好多了!什麼是一個元素?文件中有一行?你有沒有嘗試過什麼? – Jerry

回答

0

如果您正在檢查的內容數量遠遠少於文件中的行數/標記數量,最好使用關聯數組的功能來執行檢查,因爲這可以通過線性掃描(關聯陣列快速)。

proc checkForAllPresent {tokens tokenList} { 
    foreach token $tokens { 
     set t($token) "dummy value" 
    } 
    foreach token $tokenList { 
     unset -nocomplain t($token) 
    } 
    # If the array is empty, all were found 
    return [expr {[array size t] == 0}] 
} 

然後,我們需要做的只是一個小標準節,從文件中獲取行/標記並通過檢查器運行它們。假設我們正在處理行:

proc getFileLines {filename} { 
    set f [open $filename] 
    set data [read $f] 
    close $f 
    return [split $data "\n"] 
} 

set shortList [getFileLines file1.txt] 
set longList [getFileLines file2.txt] 
if {[checkForAllPresent $shortList $longList]} { 
    puts "All were there" 
} else { 
    puts "Some were absent" 
} 

它可能不如歸去的缺席線列表(return [array names t]),而不是一切是否不存在(與一般檢查「是一切有」正在與llength做),因爲它提供了更多有用的信息。 (通過更多的工作,您可以生成更多關於當前內容的信息,但是這會使代碼更加複雜,並且使事情變得不那麼清晰。)

(當搜索時,請注意線上的前導和尾隨空白很重要。所有的精確匹配在這裏,或者使用string trim


用的詞代替線工作真的很容易。你只需要稍微不同的代碼就可以從文件的讀入內容中提取令牌。

return [regexp -all -inline {\w+} $data] 

其他都是一樣的。

+0

非常小的改進:'set data [read -nonewline $ f]' –

相關問題