Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.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_Itcl - Fatal编程技术网

Tcl 防止替换输入字符串中的特殊字符

Tcl 防止替换输入字符串中的特殊字符,tcl,itcl,Tcl,Itcl,如何从用户处获取具有特殊字符的输入,并将其视为字符串而不使用“/”字符? 例如: 假设有一个过程proc a{input}{…}获取以下字符串“classA.arr2[0].classB” 如果我不在“[0]”旁边添加“/”字符,它会认为0是一个命令/过程 我会说得更清楚: 我添加了一个代码,它是评估args的Class a方法的一部分 public method config {args} { if {[llength $args] > 1} { foreach

如何从用户处获取具有特殊字符的输入,并将其视为字符串而不使用“/”字符?
例如:
假设有一个过程
proc a{input}{…}
获取以下字符串
“classA.arr2[0].classB”

如果我不在“[0]”旁边添加“/”字符,它会认为0是一个命令/过程

我会说得更清楚:
我添加了一个代码,它是评估args的
Class a
方法的一部分

public method config {args} {
    if {[llength $args] > 1} {
        foreach {option value} $args {
            if {[string length $option] == 0 || [string length $value] == 0} {
                puts "Runtime error::Bad Input: option flag or value is missing"
                return ""
            }
            switch -- $option {
                -scope { 
                    if { [regexp {[A-Za-z]+} $value] } {
                        set _scope $value 
                    } else { 
                        puts "Runtime error::Bad Input: BAD SCOPE FORMAT" 
                        return ""
                    }
                } ...
现在我想运行以下代码:

A a
a config -scope "string1.string2[0].string3"

我假设,您希望从
tclsh
手动使用您的过程。如果是这样,就把输入放在大括号内。例如:

% proc a {input} {puts "Doing stuff with $input"}
% a "classA.arr2[0].classB" ;# Zero is evaluated
invalid command name "0"
% a "classA.arr2\[0\].classB" ;# You have to escape square brackets
Doing stuff with classA.arr2[0].classB
% a {classA.arr2[0].classB} ;# Or you can take the input in braces instead
Doing stuff with classA.arr2[0].classB
在这种情况下,使用大括号可以防止计算


我还认为您的意思是
\
(反斜杠),而不是
/
(斜杠),对吗?

信息不够:您如何使用$input变量?我们需要了解您的问题所在。您的输入字符串在什么时候得到评估,以致
[0]
成为问题?Tcl从不做双重替换,所以代码中必须有一些东西。是的,你是绝对正确的。但我不想在输入时添加反斜杠或大括号,我希望它在方法内部自动执行。这意味着我希望能够使用必要的标志按原样写入字符串。简而言之,在某些情况下,您希望禁用命令扩展(因为
0
在这里被视为子命令)?问题是,而且只有在这些情况下。我很抱歉,但我想不出任何解决方案——至少除了一个定制的Tcl解释器。@MaciejStanek是对的。命令替换发生在双引号中的所有内容上。这种替换发生在控件传递给进程之前。换句话说,在proc中没有什么可以作为解决方法,因为所有替换都会在之前发生。根据您从哪里获得输入,您应该尝试在那里清理字符串。例如,将“classA.arr2[0].classB”转换为{classA.arr2[0].classB}