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