1

在 if 条件下,我想检查字符串是否包含模式,但出现以下错误。 missing operand at _@_ in expression " $extra_url eq _@_*user-new* " (parsing expression " $extra_url eq *user-n...") invoked from within "if { $extra_url eq *user-new* } {

代码如下:

if { $extra_url eq *user-new* } {
     ds_add rp [list notice "File $root/$extra_url: Not found" $startclicks [clock clicks -milliseconds]]
     ds_add rp [list transformation [list notfound "$root / $extra_url" $val] $startclicks [clock clicks -milliseconds]]

 }

在这里,我正在检查 extra_url 字符串是否包含“user_new”。我不知道我做得对不对。请帮忙。

4

3 回答 3

3

您的问题出在这一行:

if { $extra_url eq *user-new* } {

问题是表达式解析器将第一个*视为*user-new*乘法运算符,并且您连续有两个二元运算符,中间没有值标记,这是非法的语法。实际上,对于表达式解析器,您不妨这样写:

$extra_url eq * user - new *

好的,这只是在标记化之后,并且在双重运算符之后还有其他问题,即无法识别的裸字和尾随二元运算符;解析失败。(是的,表达式解析器是一个非常传统的解析器,与用于解析 C 或 Java 或……的解析器并没有完全不同(尽管比简单)

我猜您实际上想要字符串相等与文字标记(将标记放在{大括号}"双引号中"),或者您想使用命令来测试一些更复杂的情况,例如与string match. 因此,选择以下之一:

if { $extra_url eq {*user-new*} } {
if { $extra_url eq "*user-new*" } {
if { [string match *user-new* $extra_url] } {
于 2014-04-22T19:17:18.177 回答
1

检查 extra_url 字符串是否包含“user_new”:

if {[string match {*user_new*} $extra_url]} { ... }

if {[string first "user_name" $extra_url] != -1} { ... }

switch -glob $extra_url {
    {*user_name*} { ... }
}

if {[regexp "user_name" $extra_url]} { ... }

eq严格用于字符串相等。

于 2014-04-22T14:51:30.517 回答
0

假设您正在尝试精确的字符串比较,补充 Donal Fellows 的手册页(带有删减和改编):

if 命令将条件评估为表达式(与 expr 评估其参数的方式相同)。

expr 命令的操作数可以通过以下任何一种方式指定:

  1. 作为用双引号括起来的字符串。[...]
  2. 作为用大括号括起来的字符串。[...]

请注意,它隐含地排除了裸字符串。它们必须被封闭。

我不知道为什么(也许正是为了避免像你这样的字符串中的 * 和有效的 expr 运算符之间的混淆),因此它偶尔也会咬我。

于 2016-06-26T09:52:26.420 回答