使用不完整的模式
- 如果模式匹配成功地仅匹配了字符串的一部分,则模式匹配将返回
FALSE(0)
结果。也就是说,当模式完成时不能有任何剩余的字符串。
s str = "RAW BAR" s match = str ? .U1P2U w match,! s str = "RAW BAR" s match = str ? .U1P3U w match,! s str = "RAW BAR" s match = str ? .U1P4U w match,! 复制代码
- 当模式与操作数匹配时,可以有多个模式解释。
s str = "/A#####B$$$$$" s match = str ? .E1U.E w match,! 复制代码
- 第一个
“.E”
匹配子字符串“/”
,1U
匹配“A”
,第二个“.E”
匹配子字符串“#####B$$$$$”
。 - 第一个
“.E”
匹配子字符串“/A#####”
,1U
匹配字符“B”
,第二个“.E”
匹配子字符串“$$$$$”
。
不匹配运算符
- 可以通过将一元
NOT
运算符('
)与模式匹配一起使用来生成不匹配操作:
w !,"abc" ? 3L w !,"abc" '? 3L w !,"abc" ? 3N w !,"abc" '? 3N w !,"abc" '? 3E 复制代码
模式复杂性
注意:具有多个交替和不确定模式的模式匹配在应用于长字符串时,会递归到系统堆栈中的多个级别。在极少数情况下,这种递归可能会上升到几千个级别,从而威胁到堆栈溢出和进程崩溃。当这种极端情况发生时,Caché会发出<Complex Pattern>
错误,而不是冒当前进程崩溃的风险。
如果出现此类错误,建议简化模式,负责的模式则不应该使用模式匹配。
间接寻址
间接操作符(@
)允许间接为变量赋值。间接寻址是一种通过数据字段的内容提供部分或全部命令行、命令或命令参数的动态运行时替换的技术。Caché在执行相关命令之前执行替换。
尽管与其他方式相比,间接寻址方式可以更高效更通用的编码,但不是必需的。可以通过XECUTE
命令达到间接寻址的效果。
只有在明显优势的情况下才应该使用间接寻址。间接寻址可能会影响性能,因为Caché在运行时而不是在编译阶段执行所需的求值。此外,如果使用复杂的间接寻址,应确保清楚的代码逻辑。间接寻址有时很难理解。
注意:在类中使用标签或例程间接寻址时要指定Not ProcedureBlock
间接寻址由间接运算符(@
)指定。
@variable 复制代码
其中variable
标识要从中获取替换值的变量。变量可以是数组节点。
ClassMethod Indirection() { s x = "A" s x(1) = "B" d @x(1) q A(var) w !,"A" q B(var) w !,"B" q }