Хорошо, поэтому я не могу понять, как это работает. Прикрепленный код при запуске приводит к недопустимому имени команды " " при выполнении "\ t" ("#" строка 1 руки), вызванной из "switch -regexp -- $line { "(и остальная часть файла в основном)
Я столкнулся с этой проблемой и, наконец, понял, что это делает #, я попытался избежать этого, используя regsub (показано ниже). Единственный способ, которым я могу получить строку для синтаксического анализа, - это удалить # из строки вместе (inputString изменен, чтобы удалить знак #).
Основываясь на утверждении, что TCL читает все строки как текст (включая команды), я мог только предположить, что читаемая строка содержит # и не может завершить строку и, конечно же, возвращает ошибку. Однако экранирование (пробовал 1 \ и 2 \) ничего не сделало, чтобы сделать его лучше. Все, что он сделал, это добавил \ ко всем моим другим «символам без слов» (у меня было - это работало нормально, но теперь есть \ 'SS)
Если я удалю ИЛИ раскомментирую раздел переключателя {^[ \t]TEST.$}, все будет работать нормально.
Я модифицирую скрипт и игнорировал пару конкретных случаев и решил их прокомментировать.
Может кто-нибудь объяснить, что, черт возьми, происходит, и что я могу сделать, чтобы это исправить? Похоже, что файл .tcl все еще анализирует разделы #, даже если они являются комментариями, и путается.
Попытка исправить
regsub -all {\W} $line {\\&} line;
Код:
proc doConversion fname {
set inputString "* |# Bits\n* # Bits \n";
foreach line [split $inputString "\n"] {
switch -regexp -- $line {
# {^[ \t]*TEST.*$}
# {
# # Do nothing
# }
default {
}
}
}
}
doConversion "test"
Обновление: я нашел этот ресурс, который объясняет (в некоторой степени) запутанный характер комментариев, но я думаю, я все еще не уверен, что я могу с этим поделать: "Почему я не могу размещать непарные фигурные скобки в комментариях Tcl".
#
является комментарием только в том месте, где ожидается начало команды. Кроме того, встроенные скрипты (такие как рукиswitch
) могут привести к изменению того, где находится конец комментария. Это отлично от других языков и является следствием общих правил синтаксиса и того, как Tcl выполняет рекурсивную декомпозицию команд. Раз в несколько лет кто-то предлагает это «исправить», но изменить это гораздо сложнее, чем кажется на первый взгляд… - person Donal Fellows   schedule 17.07.2012