Tcl regsub заменяет другой символ другим для всех алфавитов - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно сгенерировать случайную строку вывода той же длины с учетом исходной строки. Я пробовал следующий метод:

regsub -all  -nocase ABCDEFGHIJKLMNOPQRSTUYWXYZ0123456789 ZYXWYUTSRQPONMLKJIHGFEDCBA9876543210 $str

Но результат всегда независимо от того, какие значения имеет переменная str:

ZYXWYUTSRQPONMLKJIHGFEDCBA9876543210

Мое требование - заменить или заменить что-то вроде A на Z , B к Y .... от 0 до 9 и с 9 до 0? Как мне этого добиться?

1 Ответ

1 голос
/ 04 августа 2020

Вы можете использовать string map:

# Just generating the replacements, we want to have "A Z B Y C X ... 0 9 ... 9 0"
set letters "ABCDEFGHIJKLMNOPQRSTUYWXYZ"
set numbers "0123456789"
set replacements {}

foreach l [split $letters ""] r [split [string reverse $letters] ""] {
    lappend replacements $l $r
}

foreach n [split $numbers ""] r [split [string reverse $numbers] ""] {
    lappend replacements $n $r
}

# string map in use:
set input "MEW2"
set output [string map -nocase $replacements $input]
# NYD7

Проблема с regsub заключается в том, что вы не можете легко указать ему заменить что-то, что соответствует чему-то конкретному c, вам придется создать отдельную процедуру и выполнить дальнейшие замены. Чтобы упростить задачу, просто используйте карту строк, которая предназначена для такой замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...