第五章 疯狂Caché 运算符和表达式(三)

第五章 疯狂Caché 运算符和表达式(三)

字符串连接运算符

字符串运算符(_)是将其操作数解释为字符串并返回字符串值的二进制(两个操作数)运算符。

可以使用连接来组合字符串文字、数字、表达式和变量。它采用以下形式:

operand_operand

串联生成的结果是由追加到左操作数的右操作数组成的字符串。它将它们视为字符串值。

下面的示例连接两个字符串:

 WRITE "High"_"chair"
Highchair

当将一个数字文字连接到另一个数字文字或非数字字符串时,Caché首先将每个数字转换为规范形式。

下面的示例连接两个数字文字:

 WRITE 7.00_+008
78

下面的示例连接数字文字和数字字符串:

 WRITE ++7.00_"+007"
7+007

下面的示例连接两个字符串和空字符串:

 SET A="ABC"_""_"DEF" 
 WRITE A
ABCDEF

空字符串对字符串的长度没有影响。可以将无限数量的空字符串连接到一个字符串。

最大字符串大小是可配置的。如果启用了长字符串,则最大字符串大小为3,641,144个字符。否则,最大字符串大小为32,767个字符。

当连接的字符串太长而无法存储在变量中时,创建超长字符串的连接可能会导致<store>错误。在发生<store>错误的情况下,通过串联放大的变量将保留其在串联之前的值。

连接编码的字符串

某些Caché 字符串包含内部编码,可能会限制这些字符串是否可以连接:

  • 位字符串 不能与其他位字符串、非位字符串或空字符串(“”)连接。尝试这样做会导致在访问结果字符串时出现<Invalid bit string>错误。

  • 列表结构字符串 可以与另一个列表结构字符串连接,也可以与空字符串(“”)连接。它不能与非列表字符串串联。尝试这样做会在访问结果字符串时导致<list>错误。

  • JSON字符串 不能与另一个JSON字符串、不是JSON字符串的字符串或空字符串(“”)连接在一起。尝试这样做会在访问结果字符串时导致<Invalid OREF>错误。

数值关系运算符

有两种类型的关系运算符:字符串关系运算符和数值关系运算符。数值关系运算符使用操作数的数值来生成布尔结果。

不应使用数字关系运算符比较非数字字符串。

IEEE双精度小数($DOUBLE数)与标准Caché浮点数($DECIMAL数)之间的比较是精确执行的,无需舍入。$DOUBLE$DECIMAL数字之间的相等比较通常会产生意想不到的结果,应该避免。

小于

小于运算符测试其左操作数是否在数值上小于右操作数。CachéObjectScript对这两个操作数进行数值计算,并返回布尔结果true(1)如果左操作数的数值小于其右操作数。如果左操作数的数值等于或大于右操作数,则CachéObjectScript将返回布尔值False(0)

例如:

 WRITE 9 < 6
0
WRITE 22 < 100
1

大于

大于运算符测试左操作数是否在数值上大于右操作数。CachéObjectScript对这两个操作数进行数值计算,如果左操作数在数值上大于右操作数,则结果为true(1)。如果左操作数在数值上等于或小于右操作数,则生成FALSE(0)结果。

例如:

 WRITE 15 > 15
0
 WRITE 22 > 100
0

大于或等于

可以通过以下方式生成大于或等于运算:

  • 组合二进制大于(>)和等于(=)运算符。如果两个运算符之一返回TRUE,则一起使用的两个运算符返回TRUE。
  • 使用二进制小于(<)的一元NOT运算符()。一起使用的两个运算符将二进制的真值反转为小于。

当左操作数在数值上大于或等于右操作数时,CachéObjectScript会生成TRUE(1)结果。当左操作数在数值上小于右操作数时,它会产生FALSE(0)结果。可以用以下任何一种方式表示大于或等于运算:

operand_A >= operand_B
operand_A '< operand_B
'(operand_A < operand_B)

小于或等于

可以通过以下方式生成小于或等于运算:

  • 组合二元小于(<)和等于(=)运算符。如果两个运算符之一返回TRUE,则一起使用的两个运算符返回TRUE。
  • 将一元NOT运算符()与二进制大于(>)一起使用。一起使用的两个运算符反转二进制大于的真值。

当左操作数在数值上小于或等于右操作数时,CachéObjectScript会生成TRUE(1)结果。当左操作数在数值上大于右操作数时,它会产生FALSE(0)结果。

可以用以下任何一种方式表示小于或等于运算:

operand_A <= operand_B
operand_A '> operand_B
'(operand_A > operand_B)

下面的示例在小于或等于运算中测试两个变量。因为这两个变量具有相同的数值,所以结果为真。

 SET A="55",B="55" 
 WRITE A'>B
1

字符串关系运算符

有两种类型的关系运算符:数字关系运算符和字符串关系运算符。字符串关系运算符使用操作数的字符串解释来生成布尔结果。可以在任何字符串关系运算符前面加上NOT逻辑运算符(),以获得逻辑结果的否定。

等于

等于运算符测试两个操作数的字符串相等。将二进制等于应用于两个字符串时,如果两个操作数是具有相同字符序列且没有中间字符(包括空格)的相同字符串,则CachéObjectScript返回结果true(1);否则返回结果false(0)

例如:

WRITE "SEVEN"="SEVEN"
1

二进制等于并不意味着任何操作数的任何数字解释。例如,即使两个操作数在数字上相同,下面的语句也会生成值FALSE(0)

 WRITE "007"="7"
0

如果两个操作数都有数值,则可以使用制等于运算符来测试数值是否相等。例如:

 WRITE 007=7
1

还可以使用一元算术正数强制进行数字转换。例如:

 WRITE +"007"="7"
1

如果这两个操作数的类型不同,则将两个操作数转换为字符串,并对这些字符串进行比较。

请注意,这可能会因为四舍五入和转换为字符串的有效位数而导致不准确。

例如:

DHC-APP>WRITE "007"=7,!
0
DHC-APP> WRITE 007="7",!
1
DHC-APP> WRITE 17.1=$DOUBLE(17.1),!
0
DHC-APP> WRITE 1.2345678901234567=$DOUBLE(1.2345678901234567),!
0
DHC-APP>w 17.1 = $decimal(17.1)
1

不等于

可以通过将一元NOT运算符与二进制等于一起使用来指定NOT等于运算。可以用两种方式表示不等于运算:

operand '= operand
'(operand = operand)

不等于反转应用于两个操作数的二进制等于运算符的真值。如果两个操作数不相同,则结果为TRUE(1)。如果两个操作数相同,则结果为FALSE(0)

包含

二进制包含测试右操作数中的字符序列是否为左操作数的子字符串。如果左操作数包含右操作数表示的字符串,则结果为TRUE(1)。如果左操作数不包含右操作数表示的字符串,则结果为FALSE(0)。如果右操作数为空字符串,则结果始终为真。

下面的示例测试L是否包含S。因为L确实包含S,所以结果为TRUE(1)。

 SET L="Steam Locomotive",S="Steam"
 WRITE L[S
1

下面的示例测试P是否包含S。因为字符串中的字符序列不同(P中有一个句号,S中有一个感叹号),所以结果是FALSE(0)。

SET P="Let's play.",S="Let's play!"
 WRITE P[S
0

不包含

通过将一元NOT字符与二进制CONTAINS一起使用,可以生成以下任意等效格式的不包含操作:

operand A '[ operand B
'(operand A [ operand B)

如果操作数A不包含由操作数B表示的字符串,则不包含操作返回TRUE,如果操作数A确实包含由操作数B表示的字符串,则返回FALSE。

例如:

 SET P="Beatles", S="Mick Jagger"
 WRITE P'[S
1

跟随

跟随测试左操作数中的字符是否在ASCII排序序列中右操作数中的字符之后。遵循两个字符串的测试,每个字符串都从最左边的字符开始。测试在以下任一时间结束:

  • 在左操作数中找到与右操作数中相应位置的字符不同的字符。
  • 这两个操作数中都没有更多的字符可供比较。

如果左操作数中的第一个唯一字符的ASCII值高于右操作数中的对应字符(即,如果左操作数中的字符在ASCII排序顺序中右操作数中的字符之后),则CachéObjectScript返回值为true。如果右操作数比左操作数短,但在其他方面相同,则CachéObjectScript也返回值true。

如果出现以下任一情况,CachéObjectScript将返回值False:

  • 左操作数中第一个唯一字符的ASCII值低于右操作数中相应字符的ASCII值。
  • 左操作数与右操作数相同。
  • 左操作数比右操作数短,但在其他方面相同。

下面的示例测试字符串Lampoon是否按照ASCII排序顺序跟在字符串LAMP之后。结果是真的。

WRITE "LAMPOON"]"LAMP"
1

下面的示例测试B中的字符串是否跟在A中的字符串之后,因为BO在ASCII排序规则序列中跟在BL之后,所以结果为TRUE。

 SET A="BLUE",B="BOY" 
 WRITE B]A
1

不跟随

可以使用一元NOT运算符来生成 Not Follows运算,其二进制跟随的格式为以下任一等效格式:

operand A ']operand B 
'(operand A ] operand B) 

如果操作数中的所有字符都相同,或者如果操作数A中的第一个唯一字符的ASCII值低于操作数B中的相应字符,则NOT Follow操作返回结果TRUE。如果操作数A中的第一个唯一字符的ASCII值高于操作数B中的相应字符,则NOT Follow操作将返回FALSE结果。

在下面的示例中,因为CDE中的C跟在ABC中的A之后,所以结果为FALSE。

 WRITE "CDE"']"ABC",!
 WRITE '("CDE"]"ABC")
0
0

排序

在测试左操作数是否在数值下标排序规则序列中右操作数之后排序后进行排序。在数字排序序列中,空字符串首先排序,然后是按数字顺序排列的规范数字,首先是负数,然后是零和正数,最后是非数字值。

如果第一个操作数在第二个操作数之后排序,则二进制操作数之后排序运算符返回TRUE(1),如果第一个操作数不在第二个操作数之后排序,则返回FALSE(0)。例如:

 WRITE 122]]2
WRITE "LAMPOON"]]"LAMP"

不排序

通过将一元NOT运算符与二进制排序AFTER配合使用,可以生成NOT SORT AFTER操作,其格式为以下任一等效格式:

operand A ']] operand B
'(operand A ]] operand B)

如果操作对象A与操作对象B相同,或者操作对象B在操作对象A之后排序,则CachéObjectScript返回结果true。如果操作对象A在操作对象B之后排序,则CachéObjectScript将返回False结果。

原创文章 67 获赞 86 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/106046425