在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”。 我不知道我是否做得对。请帮忙。
答案 0 :(得分:3)
你的问题就在这一行:
if { $extra_url eq *user-new* } {
问题是表达式解析器将*
的{{1}}视为乘法运算符,并且您连续有两个二元运算符,其间没有值标记,这是非法语法。实际上,对于表达式解析器,您可能也写过:
*user-new*
好的,这只是在令牌化之后,并且在双运算符之后还有其他问题,即无法识别的裸字和尾随的二元运算符;解析将失败。 (是的,表达式解析器是一个非常传统的解析器,与用于解析C或Java的解析器完全不同(虽然比它们简单)...)
我猜你实际上要求字符串与文字标记相等(将标记放在$extra_url eq * user - new *
大括号{
或}
中引用"
)或者您想使用命令来测试更复杂的情况,例如与"
的全局匹配。因此,选择其中一个:
string match
if { $extra_url eq {*user-new*} } {
if { $extra_url eq "*user-new*" } {
答案 1 :(得分: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
严格用于字符串相等。
答案 2 :(得分:0)
假设你正在尝试一个精确的字符串比较,补充Donal Fellows',从手册页(带有剪切和改编):
if command将条件计算为表达式(与expr计算其参数的方式相同)。
Operands for the expr command可以通过以下任何一种方式指定:
请注意,它隐含地排除了裸字符串。必须附上它们。
我不确定为什么(也许正是为了避免像你这样的字符串和有效的expr运算符之间的混淆),因此它偶尔会咬我一次。