Добавление дополнительной обратной косой черты к элементам списка TCL - PullRequest
0 голосов
/ 16 мая 2018

У меня есть список, который выглядит так:

list1 = {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] ....}

Когда я оперирую с элементом списка один за другим , используя цикл foreach:

`foreach ele $list1 {
puts "$ele
}`

Я получаю следующий вывод:

a.b.c.d a.bb.ccd[0] a.bb.ccd[1]

Обратите внимание, что обратный слэш пропадает (из-за языкового потока tcl).

Чтобы сохранить то же самое, я хочу добавить дополнительную обратную косую черту ко всем элементам list1, имеющим существующую обратную косую черту.

Я пытался:

regsub -all {\} $list1 {\\} list1 (Также пробовали двойные кавычки вместо фигурных скобок и других возможных испытаний).

Кажется, ничего не работает.

Есть ли способ убедиться, что $ ele сохраняет символы обратной косой черты внутри цикла foreach, так как мне нужны элементы с точно такими же символами для дальнейшей обработки.

P.S. Новичок в использовании regexp / regsub

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Если ваши входные данные имеют обратную косую черту в том виде, в котором вы хотите сохранить, вам нужно немного поработать при преобразовании этих данных в список Tcl, или Tcl просто предположит, что вы использовали обратную косую черту как обычные метасимволы Tcl. , Есть несколько способов сделать это; Вот мой личный фаворит, так как он логически выбирает именно те символы, которые нам нужны (непустые последовательности непробельных символов):

set input {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] ....}
set items [regexp -all -inline {\S+} $input]
foreach item $items {
    puts $item
}

Как видно из вывода:

a.b.c.d
a.bb.ccd\[0\]
a.bb.ccd\[1\]
....

это точно сохраняет обратную косую черту. (Кроме того, да, мне очень нравятся регулярные выражения. Особенно очень простые, как этот.)

0 голосов
/ 16 мая 2018

Как вы определили list1, это строка. Когда list1 используется с командой foreach, строка преобразуется в список. Помните, что списки в Tcl на самом деле представляют собой просто специально отформатированные строки, которые анализируются при преобразовании из строки в список. Когда элементы списка анализируются, обратные слеши удаляются в соответствии с обычными правилами синтаксического анализа Tcl. Есть несколько способов создать списки, содержащие символы, значимые для анализатора Tcl. Код ниже показывает два примера, противопоставленных вашему коду:

set list1 {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\]}
puts "list1 as a string"
puts $list1

puts "converting the list1 string to a proper list"
foreach ele $list1 {
    puts $ele
}

set list2 [list a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}]
puts "list2 build by the list command"
puts $list2

puts "list2, element by element"
foreach ele $list2 {
    puts $ele
}

set list3 {a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}}
puts "list3 build properly quoting each element"
puts $list3

puts "list3, element by element"
foreach ele $list3 {
    puts $ele
}

Выполнение этого дает:

list1 as a string
a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\]
converting the list1 string to a proper list
a.b.c.d
a.bb.ccd[0]
a.bb.ccd[1]
list2 build by the list command
a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}
list2, element by element
a.b.c.d
a.bb.ccd\[0\]
a.bb.ccd\[1\]
list3 build properly quoting each element
a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}
list3, element by element
a.b.c.d
a.bb.ccd\[0\]
a.bb.ccd\[1\]

Ваша попытка regsub сработает, если вы замените каждый обратный слеш двумя обратными слешами, но правильное построение списка намного яснее.

...