Фон. Я работаю с netlists , и, как правило, люди задают различные иерархии с помощью /
. Однако на самом деле не является незаконным использование /
в качестве части имени экземпляра.
Например, X1/X2/X3/X4
может ссылаться на экземпляр X4
внутри другого экземпляра с именем X1/X2/X3
. Или он может ссылаться на экземпляр с именем X3/X4
внутри экземпляра с именем X2
внутри экземпляра с именем X1
. Понял?
На самом деле нет «обычного» символа, который не может использоваться как часть имени экземпляра, поэтому вы прибегаете к непечатному или ... возможно, к символу, выходящему за пределы стандартного 0. .127 ASCII символов.
Я думал, что попробую (десятичную) 166, потому что для меня это выглядит как труба: ¦
.
Итак ... У меня есть некоторый код C ++, который создает имя пути, используя ¦
в качестве иерархического разделителя, поэтому путь выше выглядит как X1¦X2/X3¦X4
.
Теперь GUI написан на Tcl / Tk, и чтобы правильно перевести это в понятные человеку термины, мне нужно сделать что-то вроде следующего:
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
set humanreadable [join [split $path ¦] /]
В общем, замените ¦
на /
(я мог бы также сделать это с [string map]
).
Теперь проблема в том, что ¦
в строке, которую я получаю из C ++, не соответствует ¦
, который я могу создать в Tcl. то есть это не удается:
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
string match $path [format X1%cX2/X3%cX4 166 166]
Визуально две строки выглядят одинаково, но совпадение строк не удается. Я даже пытался использовать scan , чтобы посмотреть, перепутал ли я значения битов. Но
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
set path2 [format X1%cX2/X3%cX4 166 166]
for {set i 0} {$i < [string length $path]} {incr i} {
set p [string range $path $i $i]
set p2 [string range $path2 $i $i]
scan %c $p c
scan %c $p2 c2
puts [list $p $c :::: $p2 $c2 equal? [string equal $c $c2]]
}
Создает вывод, который выглядит , как будто все должно совпадать, за исключением [string equal]
для символов ¦
со строкой печати:
¦ 166 :::: ¦ 166 equal? 0
Для чего стоит, символ в C ++ определяется как:
const char SEPARATOR = 166;
Есть идеи, почему символ за пределами обычного диапазона ASCII потерпит неудачу? Когда я изменил разделитель на (десятичное) 28 (^\
), все работало нормально. Я просто не хочу сталкиваться с подобной проблемой на другой платформе. (В настоящее время я использую Redhat Linux).