如何在TCL中处理lindex和反斜杠?

use*_*143 4 tcl

我有一堆数据我通过Tcl解析但在使用lindex字符串时遇到问题,因为它包含反斜杠.

例如,

$data is a list split by lines, 
{123 somethinghere/somethingthere/\idontcare 123ff}
{456 apples/oranges/\bananas 921} 
{999 pikachu/ratata/\snorlax ftp}
Run Code Online (Sandbox Code Playgroud)

我循环$data并用于lindex分割这些数据并根据其类型对其进行分组:

foreach item $data {
    set num [lindex $item 0]
    set paths [lindex $item 1]
    set output [lindex $item 2]
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,反斜杠逃避了我想要的文本.

puts "$paths"
somethinghere/somethingthere/dontcare
Run Code Online (Sandbox Code Playgroud)

理想情况下,我甚至不想保留反斜杠.我的首选数据$path是:

puts "$paths"
somethinghere/somethingthere/idontcare
Run Code Online (Sandbox Code Playgroud)

建议?我不想使用正则表达式,除非这是唯一的方法.

sle*_*man 6

列表的第一条规则是:不要将非列表事项视为列表(嗯,有例外,但你的数据是一个很好的例子,为什么你应该遵循99%的情况下的规则).

要将字符串正确转换为列表,请使用split:

set i [split $item " "]
Run Code Online (Sandbox Code Playgroud)

如果拆分字符是可变的或多个char使用regexp:

set i [regexp -inline -all {\S+} $item]
Run Code Online (Sandbox Code Playgroud)

通过使用返回列表的命令,您可以确保获得正确的列表.除非你100%确定(异常)字符串并不总是可以解析为列表.


现在,至于如何摆脱\.你当然可以使用正则表达式:

set item [regsub -all {\\} $item]
Run Code Online (Sandbox Code Playgroud)

但是有一个更好的方法来做到这一点,而不使用正则表达式(我相信你会很感激),使用string map:

set item [string map {"\\" ""} $item]
Run Code Online (Sandbox Code Playgroud)