Почему lsort удаляет '\' из элементов списка? - PullRequest
0 голосов
/ 11 октября 2019

lsort удаляет '\' из элементов списка

set a [regsub -all {\d+} [list temp25 temp36] {\d+}]
puts $a
>>temp\d+ temp\d+
puts [lsort -u $a]
>>tempd+

Я знаю обходной путь для получения желаемого результата. Этот вопрос больше касается вопроса о том, ожидается ли такое поведение? Насколько я понимаю, lsort не должен изменять элементы любой ценой.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Этот вопрос больше касается вопроса о том, ожидается ли такое поведение?

Да. regsub работает и создает строку, а lsort работает со списком Tcl. Если вы передаете произвольную строку в операцию со списком, она может не интерпретироваться должным образом. Таким образом, поэтому, если вы хотите, чтобы строка (возможно, внешне похожая на список) рассматривалась также как одна, то вы должны превратить ее в одну явно, используя split.

Смотреть:

% set a {temp\d+ temp\d+}
temp\d+ temp\d+
% split $a
{temp\d+} {temp\d+}
% lsort -u [split $a]
{temp\d+}

Если не обработать должным образом, символы, специальные для Tcl, такие как обратная косая черта или скобки, будут обрабатываться как таковые. Это как:

% set _ temp\d+
tempd+
% # versus
% set _ {temp\d+}
temp\d+
0 голосов
/ 12 октября 2019

Вероятно, А. Ричард имел в виду, что split и lsort могут иметь такое же поведение, что и для строки a , передаваемой в качестве аргумента. Но они не:

set a "{temp\\d+ temp\\d+} {temp\\d+ temp\\d+} temp\\d+ temp\\d+"
puts [split $a]
puts [lsort $a]

... и, вероятно, не должны, поскольку split получает строку, а lsort получает список в качестве входных данных. Если lsort получает строку, она сначала преобразует строку в список, делая соответствующие замены. Следовательно, проблема («\ d» не существует, поэтому от нее остается только «d»).

То есть lsort выполняет в первую очередь:

list {*}$a

а затем сортирует результат.

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