Как передать сетевой путь к файлу, содержащий один прямой слеш, в качестве аргумента для tcl proc? - PullRequest
0 голосов
/ 09 ноября 2019

В TCL при передаче пути файла к процедуре одиночная косая черта обрабатывается как escape-символ, поэтому она удаляется во всех местах. Если я использую {} для передачи аргумента позже в процедуре, я не смогу преобразовать его обратно в обычный путь для любой операции замены. Функция разделения не корректно разделяет строку из фигурных скобок.

Испытания: я пытаюсь передать полный путь к файлу, содержащий одинарный и двойной слеш обратного слова (\), в процедуру tcl, чтобы заменить первую часть пути на другуюдорожка. Я попробовал следующее 1. Попытался передать путь общего каталога dir как результат: вся обратная косая черта пропала 2. Попытка отправить путь файла в виде фигурных скобок: строка передается как есть, но ее нельзя использовать в proc. Если я попытаюсь разделить путь, это даст странный результат. Расколы в случайных местах и ​​случайные символы отсутствуют. 3. со вторым вариантом использования я также попытался разделить файл, но он по-прежнему дает тот же результат, что и в случае использования 2. 4. Также попробовал функцию разделения файлов, но он требует написания цикла for, поэтому я оставлю это в качестве обходного пути, но есть ли какая-нибудь простая процедура. или я делаю что-то не так?

Код:

proc modpath {strPath} {
   puts "$strpath"     REM result /HuL0GBMV4087.example.comyourPLMB419CATEnvDevPerVisulisationV6R2017.txt
}

set fDir "\\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt"
modpath $fDir

Если я пассивирую фигурные скобки

proc modpath {strPath} {
   puts "$strpath"     REM result "//HuL0GBMV4087.example.com/yourPLM/B419/CATEnv/Dev/Per/Visulisation/V6R2017.txt"
set PathInfo [split $strCurrentCockpitPath "B419"]
puts "PathInfo : $PathInfo"

REM result PathInfo : {"//HuL0G} MV 087.example.com/yourPLM/ {} {} {} /CATEnv/Dev/Per/Visulisation/V6R20 7.txt\"
}

set fDir {"\\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt"}
modpath $fDir

Я ожидаю, что смогу пройти через аругмент с помощью фигурных скобокФункция split должна работать правильно, чтобы получить нормальный вывод строки. Я пробовал также много вариантов с split, но не смог заставить его работать правильно.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2019

Символ \ является специальным в исходном коде Tcl, так как он используется как начало escape-последовательности (например, \n - escape-последовательность для новой строки, \\ - сам символ обратной косой черты). Это означает, что если вам нужен такой символ в значении, которое происходит из текста вашего скрипта, вам нужно либо экранировать его (с самим собой), либо поместить всю строку в { фигурные скобки }, которые отключают все подстановкив. (Двойные кавычки влияют только на интерпретацию пробелов.)

set fDir "\\\\HuL0GBMV4087.example.com\\yourPLM\\B419\\CATEnv\\Dev\\Per\\Visulisation\\V6R2017.txt"
set fDir {\\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt}

Вам не нужно когда-либо делать специальный экранирование строк из других мест. Tcl не выполняет двойные замены, если это не указано явно, поэтому нежелательные замены всегда указывают на ошибку в вашем коде.


Если вы создаете URL, используйте другую косую черту, /.

0 голосов
/ 10 ноября 2019

Чтобы разделить на строки, вы также можете использовать команду textutil :: split :: splitx.

Например:

package require textutil::split
textutil::split::splitx $fDir "B419"
0 голосов
/ 09 ноября 2019

Команда split разделяется на символы, а не на строку. Он разделяется на «B», «4», «1» и «9» в соответствии с запросом, и возвращаемое значение является правильным.

Вы можете использовать команду regexp , чтобы получитьчто хочешь:

# substitute \\ for / if the path contains backslashes
set pathinfo [regexp -inline {^(.*)/B419/(.*)$} $strpath]
...