Как это сделать

puts [string map { ( ) "\(" "\)"} (3.8.001)] 

О \ p я получаю $ tclsh main.tcl

(3.8.001)

Я ожидаю

\(3.8.001\)

Помогите мне сделать это

0
Aroon 13 Мар 2018 в 09:22

2 ответа

Лучший ответ

Всякий раз, когда я не понимаю, как именно написать сложное string map с использованием обратной косой черты, я пытаюсь создать список сопоставления с помощью list. Тогда я мог бы использовать литерал, который он создает, вместо того, чтобы мой скрипт содержал фактический вызов команды list, но с моей стороны это чисто оптимизация. (И очень маленькое значение; компилятор байт-кода сделает это за меня, если все аргументы для list являются литералами.) В особенно сложных случаях я построю его поэтапно с lappend, но это только там, где творится настоящая царапина!

Также предполагается, что отображение должно быть "replaceA withA replaceB withB ..."; вы помещали ) и "\(" в неправильном порядке, и не ожидалось, что результат вообще будет работать.

set mapping [list "(" "\\(" ")" "\\)"]
# puts "mapping is “$mapping”";  # Yay for unicode quote characters!
puts [string map $mapping (3.8.001)] 

Последовательность, которую вы искали, такова, с еще несколькими фигурными скобками и меньшим количеством двойных кавычек, но я рекомендую вам научиться решать эту проблему самостоятельно ...

puts [string map {( {\(} ) {\)}} "(3.8.001)"]
1
Donal Fellows 13 Мар 2018 в 07:13

Вы должны использовать string map следующим образом:

puts [string map { ( "\\(" ) "\\)"} (3.8.001)]

Обратную косую черту нужно использовать дважды, чтобы иметь одинарную обратную косую черту при использовании внутри двойных кавычек в Tcl.

4
Dinesh 13 Мар 2018 в 06:51