如何在文件中搜索列表的每个元素

时间:2014-03-05 10:54:45

标签: tcl

如何使用TCL组织一个循环来搜索列表中每个元素存在于文件或另一个列表中,如果它不存在则返回不匹配的元素。

1 个答案:

答案 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]

其他一切都是一样的。