解析tcl中的字符串参数

解析tcl中的字符串参数,tcl,Tcl,我将参数传递给函数StcPortConfig,如下所示: STC::StcPortConfig m:$port_b fc:1 pause_frame_rate:30 pause_val:"FFFF" mode:"gen"; 在StcPortconfig函数中,我需要解析不同的参数值,具体操作如下: proc ::STC::StcPortConfig {args} { foreach arg $args { regexp {([A-Za-z0-9_-]+):([a-z0-9,-

我将参数传递给函数StcPortConfig,如下所示:

 STC::StcPortConfig m:$port_b fc:1 pause_frame_rate:30 pause_val:"FFFF" mode:"gen";
在StcPortconfig函数中,我需要解析不同的参数值,具体操作如下:

 proc ::STC::StcPortConfig {args} {

  foreach arg $args {
    regexp {([A-Za-z0-9_-]+):([a-z0-9,-_ ]*)} $arg match cmd value

 if {$cmd == "pause_frame_rate"} {
    set pause_frame_rate $value
    set pause_frame 1
  }
 if {$cmd == "mode"} {
    set mode $value
    puts "\nport is configured as $mode\n"
  }
}
我能够读取pause\u frame\u rate(设置为30)的值。但当我阅读“mode”时,解析字符串有一个问题。打印语句给出“端口配置为”

当我阅读args时,其打印如下: 参数为m:1 fc:1暂停\u帧\u速率:30暂停\u值:\'FFFF\'模式:\'gen\'


我在试图解析字符串而不是整数/数字的参数时遗漏了一些东西

我没有使用mode:“gen”,而是将它改为mode:gen,它就可以工作了

您可以使用
string trim
删除引号。另一种实现方式:

proc ::STC::StcPortConfig {args} {
    foreach arg $args {
        regexp {([\w-]+):(.*)} $arg -> cmd value
        set value [string trim $value {"}]   ; # remove double quotes
        switch -exact -- $cmd {
            pause_frame_rate {
                set pause_frame_rate $value
                set pause_frame 1
            }
            mode {
                set mode $value
                puts "\nport is configured as $mode\n"
            }
        }
    }
}

您可以将regexp更改为包含
\“
,这样就不会出现前一行的问题。