第五章 疯狂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结果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353