【问题标题】:Preventing substitution of special characters in an input string防止替换输入字符串中的特殊字符
【发布时间】:2018-08-09 12:42:54
【问题描述】:

如何在不使用“/”字符的情况下从用户那里获取包含特殊字符的输入并将其视为字符串?
例如:
假设有一个过程proc a {input} {...} 得到以下字符串"classA.arr2[0].classB"
如果我没有在“[0]”旁边添加字符“/”,它会认为 0 是一个命令/过程。

我会说得更清楚:
我添加了一个代码,它是评估参数的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"

【问题讨论】:

  • 信息不足:您如何使用 $input 变量?
  • 我们需要看看您的问题出在哪里。您的输入字符串在什么时候被评估以使[0] 成为问题? Tcl 从不做双重替换,所以你的代码中必须有一些东西。

标签: tcl itcl


【解决方案1】:

我假设,您想从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

在这种情况下,使用大括号会阻止评估。

我也相信你的意思是\(反斜杠),而不是/(斜杠),对吗?

【讨论】:

  • 是的,你完全正确。但是我不想在输入输入时添加反斜杠或大括号,我希望它在方法内自动执行。这意味着我希望能够使用必要的标志来编写字符串
  • 那么,简而言之,您想在某些情况下禁用命令扩展(因为0 在这里被视为子命令)?问题是,“command substitution is not performed on words enclosed in braces”并且仅在这些情况下。我很抱歉,但我没有想到任何解决方案——至少除了自定义 Tcl 解释器之外。
  • @MaciejStanek 是对的。命令替换发生在用双引号括起来的所有内容上。并且此替换发生在将控件传递给您的过程之前。换句话说,您无法在 proc 内部执行任何操作作为解决方法,因为所有替换都在之前发生过。根据您获得输入的位置,您应该尝试在那里清理字符串。例如。将“classA.arr2[0].classB”转换为 {classA.arr2[0].classB}
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多