Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl:将带方括号的参数传递给过程_Tcl - Fatal编程技术网

Tcl:将带方括号的参数传递给过程

Tcl:将带方括号的参数传递给过程,tcl,Tcl,我希望将字符串参数传递给tcl过程,而不将方括号的内容解释为命令,也不使用\来转义方括号。例如: proc resolve_signal_path {signal_path} { puts $signal_path # Replace [] with (): set signal_path [string map -nocase {"[" "(" "]" ")"} $signal_path] return $signal_path } puts [resolve

我希望将字符串参数传递给tcl过程,而不将方括号的内容解释为命令,也不使用\来转义方括号。例如:

proc resolve_signal_path {signal_path} {
    puts $signal_path
    # Replace [] with ():
    set signal_path [string map -nocase {"[" "(" "]" ")"} $signal_path]
    return $signal_path
}

puts [resolve_signal_path abc[0]]
这会出现“无效命令名”0“错误。我怎样才能传递这样的论点? 我试图用单引号括住这个论点,但没有用

更新:如果参数是一个列表而不是一个字符串(源于读取文件行),特别是有没有办法处理此问题:

proc resolve_signal_path {args} {
set signal_name [lindex $args 0]
puts $signal_name
# Replace [] with ():
set signal_path [string map -nocase {"[" "(" "]" ")"} $signal_name]
return $signal_path
}

# The following "fileline" comes from reading a file so I cannot change it  
# fileline:  abc[0] 2nd 3rd
puts [resolve_signal_path $fileline]  

考虑到这个“fileline”变量包含[],我如何传递这个作为字符串列表的“fileline”变量?

Tcl总是使用
[
..
]
来指示命令替换,除非您以某种方式引用它。引用有几种方法,例如使用各种反斜杠序列(其中,
\[
..
\]
是迄今为止最简单的),但最好的方法是将整个参数放在
{
括号
}
中,因为这样只会抑制所有此类替换(也包括反斜杠和变量替换):

Tcl没有做的是给你一种说“选择不为某个命令的特定参数进行替换”的方式,因为它在处理了替换之后才正式查找命令的含义/实现。在这种情况下,你需要使用
substitute
来获得选择性(这可能是命令中可能隐藏的内容,但这会变得更加复杂):

老实说,我不经常用那种东西。用大括号,偶尔用反斜杠,效果都很好


在更新的问题中,有一些额外的事情要考虑。

  • [
    ]
    字符实际上并不是列表的专用字符,尽管Tcl的列表生成命令仍然会引用它们
  • args
    形式参数是特殊的(当它是最后一个参数时),并且始终包含(剩余)参数的列表。这意味着如果
    $fileline
    本身是一个列表,则需要经历两个级别的列表
  • 在用替换的片段构建列表时,始终使用列表生成命令,如
    list
    lrepeat
    lappend
    等。在解析常规字符串以获取列表时,
    scan
    regexp
    split
    都可以返回列表,如果正确要求,也可以返回
因此,我将用如下内容解析abc[0]2nd 3rd:

set words [regexp -inline -all {\S+} $line]
因为这将有选择地规范化间距并添加所需的任何引用。(在本例中,它将输入转换为
{abc[0]}2nd 3rd
)您需要准确地整理出与
$line
对应的值-我不太清楚您的代码-但一旦列表转换完成,您就可以安全地使用
lindex
来挑选单个单词,不管它们曾经有什么字符

set signal_name [lindex $words 0]
# It'll now be exactly “abc[0]”

解析通常是理解您可能拥有的输入,并使您的代码能够轻松地实际理解输入。这听起来很简单。

Tcl使用
[
]
表示命令替换,除非您以某种方式引用它。有几种方法可以进行引用,例如使用各种反斜杠序列(其中,
\[
..
\]
是最简单的),但最好的方法是将整个参数放在
{
大括号
}中
,因为这只会抑制所有此类替换(也包括反斜杠和变量替换):

Tcl没有做的是给你一种说“选择不为某个命令的特定参数进行替换”的方式,因为它在处理了替换之后才正式查找命令的含义/实现。在这种情况下,你需要使用
substitute
来获得选择性(这可能是命令中可能隐藏的内容,但这会变得更加复杂):

老实说,我不经常用那种东西。用大括号,偶尔用反斜杠,效果都很好


在更新的问题中,有一些额外的事情要考虑。

  • [
    ]
    字符实际上并不是列表的专用字符,尽管Tcl的列表生成命令仍然会引用它们
  • args
    形式参数是特殊的(当它是最后一个参数时),并且始终包含(剩余)参数的列表。这意味着如果
    $fileline
    本身是一个列表,则需要经历两个级别的列表
  • 在用替换的片段构建列表时,始终使用列表生成命令,如
    list
    lrepeat
    lappend
    等。在解析常规字符串以获取列表时,
    scan
    regexp
    split
    都可以返回列表,如果正确要求,也可以返回
因此,我将用如下内容解析abc[0]2nd 3rd:

set words [regexp -inline -all {\S+} $line]
因为这将有选择地规范化间距并添加所需的任何引用。(在本例中,它将输入转换为
{abc[0]}2nd 3rd
)您需要准确地整理出与
$line
对应的值-我不太清楚您的代码-但一旦列表转换完成,您就可以安全地使用
lindex
来挑选单个单词,不管它们曾经有什么字符

set signal_name [lindex $words 0]
# It'll now be exactly “abc[0]”

解析通常是一个理解您可能拥有的输入的问题,并使您的代码更容易实际理解输入。这听起来很简单。

谢谢Donal,我应该更好地指定问题。我已经更新了描述。我的问题是,此参数必须作为包含一个文件行。所以我不能把它括在{}中。谢谢Donal,我应该知道
set signal_name [lindex $words 0]
# It'll now be exactly “abc[0]”