Невозможно сопоставить строку в if l oop в TCL - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь проверить предложение в файле. У меня пока это есть, но оно всегда печатает «один». Ожидается "ноль". Есть ли проблема с моим регулярным выражением?

Содержимое файла:

This is the header.
  Test is a pass.
This is the footer.

Код указан ниже:

set file [open "test.report" r]

while {[gets $file line] != -1} {
   if {[regexp {\s+Test is a pass} $line]} {
      puts "zero"
   } else {
      puts "one"
   }
}

close $file

1 Ответ

0 голосов
/ 04 мая 2020

Если вы просто хотите проверить, присутствует ли строка, и вы не ищете слишком большой файл (в этом контексте 100 МБ не слишком большой, но 1 ГБ приближается), вы можете просто загрузить файл сразу и используйте режим сопоставления регулярных выражений с учетом строки.

set f [open "thefile.report"]
set data [read $f]
close $f

if {[regexp -line {\s+Test is a pass} $data]} {
    puts "The test passed"
} else {
    puts "The test did not pass"
}

Вам все равно нужно будет тщательно продумать, что на самом деле искать. В частности, если файл содержит цветовые коды ANSI, то ваш тест также должен соответствовать им.


Для больших файлов правильная обработка строки за раз, но тогда вам нужно правильно определить семантику , Для этого проще всего написать вспомогательную процедуру, и tryfinally… тоже очень помогает:

proc isMatching {filename regular_expression} {
    set f [open $filename]
    try {
        while {[gets $f line] >= 0} {
            if {[regexp -- $regular_expression $line]} {
                return true
            }
        }
        return false
    } finally {
        close $f
    }
}

if {[isMatching "thefile.report" {\s+Test is a pass}]} {
    puts "The test passed"
} else {
    puts "The test did not pass"
}

Если у вас есть файлы с одной строкой длиной более 1 ГБ, значит, у вас есть кое-что действительно ужасно. Возможно создать системы обработки, чтобы справиться с этим, но это противно и требует более хитрых методов. Спросите еще раз, не повезло ли вам застрять с этим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...