Добавление дополнительной обратной косой черты к элементам списка TCL

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

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


person Aaqib    schedule 16.05.2018    source источник


Ответы (2)


Если в ваших входных данных есть обратные косые черты, подобные тем, которые вы хотите сохранить, вам нужно приложить немного дополнительных усилий при преобразовании этих данных в список 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\]
....

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

person Donal Fellows    schedule 16.05.2018
comment
Почему не split? - person Johannes Kuhn; 16.05.2018
comment
Спасибо, Дональд, да, это сработало для меня, так как у меня был список, собранный из предыдущей команды. - person Aaqib; 17.05.2018
comment
@JohannesKuhn Проблема с split заключается в том, что происходит, когда есть два разделителя подряд. - person Donal Fellows; 17.05.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 сработает, если вы замените каждую обратную косую черту двумя обратными косыми чертами, но правильное построение списка намного понятнее.

person andy mango    schedule 16.05.2018
comment
Энди, спасибо за разъяснение. Впредь я буду правильно составлять список. Но в моем нынешнем сценарии я получал список из предыдущей команды, которую я выполнил. Итак, решение Дональда, похоже, сработало. - person Aaqib; 17.05.2018