语法 TCL:_@_ 处缺少运算符
Syntax TCL: missing operator at _@_
我正在尝试获取列表的最大值,该列表可能包含零,0。在 Tcl 8.5 中,当我 运行:
set x {-5 -4 -3 -2 -1 0 1 2 3 4 5}
set maxx [expr max($x)]
set minx [expr min($x)]
puts "$minx $maxx"
我收到错误:
missing operator at _@_
in expression "max(-5 -4 -3 -2 -1 _@_0 1 2 3 4 5)"
(parsing expression "max(-5 -4 -3 -2 -1 0 1...")
invoked from within
"expr "max($x)""
invoked from within
"set maxx [expr "max($x"]"
我已经尝试过我能找到的所有语法变体和资源。
作为解决方法,我将只使用 lsort 并获取该列表的 first/last 元素,但我真的很想知道我在这里做错了什么:/谢谢。
Tcl 表达式的工作方式有点不同,您不能直接将列表塞入其中并期望它工作。
我建议你直接使用::tcl::mathfunc::max
,参数扩展({*}
):
set maxx [::tcl::mathfunc::max {*}$x]
set minx [::tcl::mathfunc::min {*}$x]
但如果您仍想使用 expr
,您可以尝试使用 join:
创建一个有效的表达式
set maxx [expr "max([join $x ,])"]
set minx [expr "min([join $x ,])"]
但这性能很差,可以被利用(代码注入),请考虑 x
的输入:{-1 {[puts "Not good"; exit]} 2}
有点详细。如有不妥请告知
对于解释器来说,调用 foo {{a a a} {b b} c}
有一个参数(由三个项目或词组成),而 foo {a a a} {b b} c
有三个参数(每个由三个、两个或一个项目或词组成).只要命令的调用是一个适当的列表,解释器就不会关心参数的组成或数量。命令 otoh 通常关心参数的数量和内容。
这意味着我们可能不得不偷偷摸摸。我们可以将 foo
和 bar
分配给变量 x
吗?是的,但不是 set x foo bar
,因为 set
命令(不是解释器)需要一个或两个参数(变量名和零或一个值)。如果我们将其作为 set x {foo bar}
或 set x [list foo bar]
调用,我们将获得正确数量的参数。
在其他时候,我们将一堆值打包在一个列表中,但该命令要求每个值都在其自己的参数中(您的 max
命令就是一个示例)。 ::tcl::mathfunc::max {2 3 1}
失败,因为该命令识别出它已被赋予单个值,并且该值应符合双精度浮点数的格式。在这种情况下,我们执行与在列表中打包值的近似逆操作:我们将列表解包为参数。 ::tcl::mathfunc::max {*}{2 3 1}
对解释器来说,与写 ::tcl::mathfunc::max 2 3 1
相同,后者有效。
(如果 foo
是零项或一项的列表,set x {*}$foo
将始终有效。考虑一下。)
在 expr
表达式中调用 max
命令作为函数是另一种蠕虫病毒。一般来说,对于更简单、固定的表达式(例如 expr {max($a,$b)}
)使用 expr
并找到 f.i 更好(恕我直言)。通过调用不涉及 expr
.
命令的列表的最大值
我正在尝试获取列表的最大值,该列表可能包含零,0。在 Tcl 8.5 中,当我 运行:
set x {-5 -4 -3 -2 -1 0 1 2 3 4 5}
set maxx [expr max($x)]
set minx [expr min($x)]
puts "$minx $maxx"
我收到错误:
missing operator at _@_
in expression "max(-5 -4 -3 -2 -1 _@_0 1 2 3 4 5)"
(parsing expression "max(-5 -4 -3 -2 -1 0 1...")
invoked from within
"expr "max($x)""
invoked from within
"set maxx [expr "max($x"]"
我已经尝试过我能找到的所有语法变体和资源。
作为解决方法,我将只使用 lsort 并获取该列表的 first/last 元素,但我真的很想知道我在这里做错了什么:/谢谢。
Tcl 表达式的工作方式有点不同,您不能直接将列表塞入其中并期望它工作。
我建议你直接使用::tcl::mathfunc::max
,参数扩展({*}
):
set maxx [::tcl::mathfunc::max {*}$x]
set minx [::tcl::mathfunc::min {*}$x]
但如果您仍想使用 expr
,您可以尝试使用 join:
set maxx [expr "max([join $x ,])"]
set minx [expr "min([join $x ,])"]
但这性能很差,可以被利用(代码注入),请考虑 x
的输入:{-1 {[puts "Not good"; exit]} 2}
有点详细。如有不妥请告知
对于解释器来说,调用 foo {{a a a} {b b} c}
有一个参数(由三个项目或词组成),而 foo {a a a} {b b} c
有三个参数(每个由三个、两个或一个项目或词组成).只要命令的调用是一个适当的列表,解释器就不会关心参数的组成或数量。命令 otoh 通常关心参数的数量和内容。
这意味着我们可能不得不偷偷摸摸。我们可以将 foo
和 bar
分配给变量 x
吗?是的,但不是 set x foo bar
,因为 set
命令(不是解释器)需要一个或两个参数(变量名和零或一个值)。如果我们将其作为 set x {foo bar}
或 set x [list foo bar]
调用,我们将获得正确数量的参数。
在其他时候,我们将一堆值打包在一个列表中,但该命令要求每个值都在其自己的参数中(您的 max
命令就是一个示例)。 ::tcl::mathfunc::max {2 3 1}
失败,因为该命令识别出它已被赋予单个值,并且该值应符合双精度浮点数的格式。在这种情况下,我们执行与在列表中打包值的近似逆操作:我们将列表解包为参数。 ::tcl::mathfunc::max {*}{2 3 1}
对解释器来说,与写 ::tcl::mathfunc::max 2 3 1
相同,后者有效。
(如果 foo
是零项或一项的列表,set x {*}$foo
将始终有效。考虑一下。)
在 expr
表达式中调用 max
命令作为函数是另一种蠕虫病毒。一般来说,对于更简单、固定的表达式(例如 expr {max($a,$b)}
)使用 expr
并找到 f.i 更好(恕我直言)。通过调用不涉及 expr
.