第六章 Caché 函数大全 $CASE 函数
比较表达式并返回第一个匹配大小写的值。
大纲
$CASE(target,case:value,case:value,...,:default)
参数
- target 其值要与大小写匹配的文字或表达式。
- case 文字或表达式的值应与目标计算的结果相匹配。
- value 成功匹配相应大小写后要返回的值。
- default 可选-如果没有大小写匹配目标,则返回的值。
描述
$CASE
函数将目标与案例列表(文字或表达式)进行比较,并返回第一个匹配案例的值。可以指定无数个case:value
对。$Case
按照指定的顺序进行匹配(从左到右);当遇到第一个完全匹配项时,匹配停止。
如果没有匹配的大小写,则返回默认值。如果没有匹配的大小写且未指定默认值,则Caché会发出错误。
Caché允许不带case:value
对指定$CASE
。无论目标值如何,它始终返回默认值。
参数
target
$CASE
计算一次该表达式,然后按从左到右的顺序将结果与每种情况匹配。
case
大小写可以是文字或表达式;文字的匹配要比匹配的表达式有效得多,因为文字可以在编译时求值。每个CASE
必须与一个值配对。可以指定数量不受限制的案例和值对。
value
值可以是文字或表达式。使用$CASE
作为GOTO
命令或DO
命令的参数会限制值,如下所示:
- 当将
$CASE
语句与GOTO
命令一起使用时,每个值都必须是有效的行标签。它不能是表达式。 - 当将
$CASE
语句与DO
命令一起使用时,每个值必须是一个有效的DO
参数。这些DO
参数可以包含参数。
default
默认指定为case:value
对,但逗号(用于分隔对)和冒号(用于配对项)之间没有指定大小写。默认是可选的。如果指定,它将始终是$CASE
函数中的最终参数。默认值遵循与value参数相同的GOTO
和DO
限制。
如果没有匹配的大小写且未指定默认值,则Caché会发出<ILLEGAL VALUE>
错误。
示例
以下示例采用星期几,并返回相应的日期名称。请注意,提供了默认值“entry error
”:
/// d ##class(PHA.TEST.Function).Case()
ClassMethod Case()
{
SET daynum=$ZDATE($HOROLOG,10)
WRITE $CASE(daynum,
1:"Monday",2:"Tuesday",3:"Wednesday",
4:"Thursday",5:"Friday",
6:"Saturday",7:"Sunday",:"entry error")
}
DHC-APP>d ##class(PHA.TEST.Function).Case()
Wednesday
下面的示例将棒球击球手获得的垒数作为输入,并写出适当的棒球术语:
/// d ##class(PHA.TEST.Function).Case1()
ClassMethod Case1()
{
SET hit=$RANDOM(5)
SET atbat=$CASE(hit,1:"single",2:"double",3:"triple",4:"home run",:"strike out")
WRITE hit," = ",atbat
}
DHC-APP>d ##class(PHA.TEST.Function).Case1()
0 = strike out
DHC-APP>d ##class(PHA.TEST.Function).Case1()
2 = double
DHC-APP>d ##class(PHA.TEST.Function).Case1()
3 = triple
DHC-APP>d ##class(PHA.TEST.Function).Case1()
1 = single
DHC-APP>d ##class(PHA.TEST.Function).Case1()
4 = home run
以下示例使用$CASE
作为do
命令参数。它调用适用于EXP
指数值的例程:
/// d ##class(PHA.TEST.Function).Case2()
ClassMethod Case2()
{
Start ; Raise an integer to a randomly-selected power.
SET exp=$RANDOM(6)
SET num=4
DO $CASE(exp,0:NoMul(),2:Square(num),3:Cube(num),:Exponent(num,exp))
WRITE !,num," ",result,!
RETURN
Square(n)
SET result=n*n
SET result="Squared = "_result
RETURN
Cube(n)
SET result=n*n*n
SET result="Cubed = "_result
RETURN
Exponent(n,x)
SET result=n
FOR i=1:1:x-1 { SET result=result*n }
SET result="exponent "_x_" = "_result
RETURN
NoMul()
SET result="multiply by zero"
RETURN
}
DHC-APP>d ##class(PHA.TEST.Function).Case2()
4 exponent 5 = 1024
DHC-APP>d ##class(PHA.TEST.Function).Case2()
4 exponent 1 = 4
DHC-APP>d ##class(PHA.TEST.Function).Case2()
4 Squared = 16
DHC-APP>d ##class(PHA.TEST.Function).Case2()
4 multiply by zero
下面的示例测试字符输入是字母还是其他字符:
/// d ##class(PHA.TEST.Function).Case3()
ClassMethod Case3()
{
READ "Input a letter: ",x,!
SET chartype=$CASE(x?1A,1:"letter",:"other")
WRITE chartype
}
DHC-APP>d ##class(PHA.TEST.Function).Case3()
Input a letter: a
letter
DHC-APP>d ##class(PHA.TEST.Function).Case3()
Input a letter: 1
other
下面的示例使用$CASE
确定要返回哪个下标变量:
/// d ##class(PHA.TEST.Function).Case4()
ClassMethod Case4()
{
SET dabbrv="W"
SET wday(1)="Sunday",wday(2)="Monday",wday(3)="Tuesday",
wday(4)="Wednesday",wday(5)="Thursday",wday(6)="Friday",wday(7)="Saturday"
WRITE wday($CASE(dabbrv,"Su":1,"M":2,"Tu":3,"W":4,"Th":5,"F":6,"Sa":7))
}
DHC-APP>d ##class(PHA.TEST.Function).Case4()
Wednesday
以下示例未指定case:value
对。它返回默认字符串“not defined
”:
/// d ##class(PHA.TEST.Function).Case5()
ClassMethod Case5()
{
SET dummy=3
WRITE $CASE(dummy,:"not defined")
}
DHC-APP>d ##class(PHA.TEST.Function).Case5()
not defined