如何使用TCL组织一个循环来搜索列表中每个元素存在于文件或另一个列表中,如果它不存在则返回不匹配的元素。
答案 0 :(得分:0)
如果您要检查的内容数量明显小于文件中的行数/令牌数,则最好使用关联数组的功能进行检查,因为这可以通过线性扫描完成(关联数组 fast )。
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]
其他一切都是一样的。