Tcl,如果不工作

Tcl,如果不工作,tcl,Tcl,我正在尝试与Tcl进行字符串匹配。然而,当我期望它不匹配时,它似乎是匹配的,因为当它不应该匹配时,它继续“我不希望它这样做”。希望这是有意义的。在log.text文件中,它应该包含“这是一个字符串” 您的代码似乎工作正常: $cat log.text 这是一根绳子 这条线不匹配 啊,现在您已经清楚地说明了您想要什么:字符串是否存在于文件中,是或否。下面是一些实现方法: 读取整个文件,并将字符串与之匹配 set file [open log.text r] set contents [read

我正在尝试与Tcl进行字符串匹配。然而,当我期望它不匹配时,它似乎是匹配的,因为当它不应该匹配时,它继续“我不希望它这样做”。希望这是有意义的。在log.text文件中,它应该包含“这是一个字符串”


您的代码似乎工作正常:

$cat log.text
这是一根绳子
这条线不匹配

啊,现在您已经清楚地说明了您想要什么:字符串是否存在于文件中,是或否。下面是一些实现方法:

  • 读取整个文件,并将字符串与之匹配

    set file [open log.text r]
    set contents [read -nonewline $file]
    close $file
    set pattern_exists [string match -nocase *$var1* $contents]
    if {$pattern_exists} {puts "$var1 found in file"}
    
  • 逐行读取文件,直到找到模式

    set pattern_exists false
    set file [open log.text r]
    while {[gets $file line] != -1} {
        if {[string match -nocase *$var1* $line]} {
            set pattern_exists true
            break
        }
    }
    close $file
    if {$pattern_exists} {puts "$var1 found in file"}
    
  • 调用grep执行繁重的工作:当找不到模式时,grep以非零状态退出,并且
    exec
    认为非零退出状态是一个例外(请参阅)

  • 您编写的代码是有效的……但我猜它是其他东西的代理。如果要查看任意字符串是否作为行的子字符串存在,最好先使用
    string
    而不是
    string match
    ,因为后者有几个元字符(特别是
    [
    ]
    ,它们表示一组字符)如果你没有预料到的话,这可能会导致问题

    尝试:

    或者,在构建搜索模式时应用相关的反斜杠引号(可能使用
    string map
    ),或者使用
    regexp
    ,这有一个有用的查找文字模式:

    if {[regexp -nocase ***=$var1 $data]} {
        # The substring was there...
    }
    

    ***=
    表示“此模式的其余部分是要匹配的文本字符串”,我们可以将
    -nocase
    作为一个选项传递,以允许我们不需要使用
    字符串toupper

    当您希望它匹配时它匹配吗?当它不匹配时,它继续“FAIL-Dot-match”那么它是否工作正常?考虑到问题的标题,你似乎被双重否定所迷惑。我试图做的是,如果它与字符串不匹配,那么测试就会失败。你能为问题提供一个示例输入,并准确描述你对该输入的预期情况吗,如果将log.text的内容更改为“这是一行”,会发生什么情况?但是我不希望它做任何事情。我不想把它打印出来,就像我说的,你们可能会被双重否定逻辑弄糊涂。如果您只是通过删除
    来反转条件,那么程序是否能像您预期的那样工作?是,如果我删除“!”则程序可以运行。删除后,它将打印代码中的puts行。@Channing,我的输入文件有2行,输出文件有1行。对于匹配$var1的行,没有输出。对于与$var1不匹配的行,输出“是”。什么是困惑?谢谢你多纳尔的帮助。
    
    set pattern_exists false
    set file [open log.text r]
    while {[gets $file line] != -1} {
        if {[string match -nocase *$var1* $line]} {
            set pattern_exists true
            break
        }
    }
    close $file
    if {$pattern_exists} {puts "$var1 found in file"}
    
    try {
        exec grep -qi $var1 log.text
        set pattern_exists true
    } on error {e} {
        set pattern_exists false
    }
    if {$pattern_exists} {puts "$var1 found in file"}
    
    if {[string first [string toupper $var1] [string toupper $data]] >= 0} {
        # The substring was there...
    }
    
    if {[regexp -nocase ***=$var1 $data]} {
        # The substring was there...
    }