第二十七章 Caché 函数大全 $LISTBUILD 函数

第二十七章 Caché 函数大全 $LISTBUILD 函数

根据指定的表达式构建元素列表。

大纲

$LISTBUILD(element,...) 
$LB(element,...)

SET $LISTBUILD(var1,var2,...)=list
SET $LB(var1,var2,...)=list

参数

  • element 一个指定列表元素值的表达式。可以是单个表达式,也可以是逗号分隔的表达式列表中的一个表达式。可以为省略的元素指定一个占位符逗号。
  • var 一个变量,指定为单个变量或以逗号分隔的变量列表中的变量。可以为省略的变量指定一个占位符逗号。 var可以是任何类型的变量:局部变量,进程私有变量或全局变量,未下标或下标。
  • list 计算结果为有效列表的表达式。由于列表包含编码,因此必须使用$LISTBUILD$LISTFROMSTRING创建列表,或者使用$LIST从另一个列表中提取列表。

描述

$LISTBUILD有两种语法形式:$LISTBUILDSET $LISTBUILD

  • $LISTBUILD(element1,element2,...)接受一个或多个表达式,并为每个表达式返回一个包含一个元素的编码列表结构。元素以指定的顺序放置在列表中。元素从1开始计数。
  • SET $LISTBUILD(var1,var2,...)= list将列表中的多个元素提取到变量中。 list的每个元素都将复制到var变量中,该变量与其在$LISTBUILD参数列表中的位置相对应。

$LISTBUILD(element1,element2,...)

$LISTBUILD接受一个或多个表达式,并为每个表达式返回一个包含一个元素的编码列表结构。元素以指定的顺序放置在列表中。元素从1开始计数。

以下功能可用于创建列表:

  • $LISTBUILD,它从多个数据项(字符串或数字)创建一个列表,每个数据项一个列表元素。 $LISTBUILD也可用于创建不包含数据的列表元素。
  • $LISTFROMSTRING,它从包含多个定界元素的单个字符串创建列表。
  • $LIST,从现有列表中提取子列表。
  • 空字符串(“”)也被视为有效列表。空字符串(“”)用于表示一个空列表,该列表不包含任何元素。因为它不包含列表元素,所以$LISTLENGTH(“”)返回的元素计数为0。
  • 某些$CHAR非打印字符组合,例如$CHAR(1)$CHAR(2,1)$CHAR(3,1,asciicode)也可以返回已编码的空列表或单元素列表。

可以使用$LISTVALID函数来确定表达式是否为有效列表。

$LISTBUILD与其他$LIST函数一起使用:$LISTDATA$LISTFIND$LISTGET$LISTNEXT$LISTLENGTH$LISTSAME$LISTTOSTRING

如果列表元素中的一个或多个字符是宽字符(Unicode),则该元素中的所有字符均表示为宽字符。为了确保系统之间的兼容性,无论硬件平台如何,$LISTBUILD始终以相同的方式存储这些字节。宽字符表示为字节字符串。

注意:$LISTBUILD和其他$LIST函数使用优化的二进制表示形式来存储数据元素。因此,当比较编码列表时,等效测试可能无法按预期工作。在其他情况下,可能被视为等效的数据可能具有不同的内部表示形式。例如,$LISTBUILD(1)不等于$LISTBUILD(“1”)$LISTBUILD(1.0)不等于$LISTBUILD(1)。但是,列表显示功能(例如$LIST$LISTTOSTRING)以规范形式返回数字列表元素值。因此,$LIST($LISTBUILD(1),1)= $LIST($LISTBUILD(“ 1”),1)

出于相同的原因,在使用定界符的字符搜索和解析函数(例如$PIECE$LENGTH的两个参数形式)中,不应使用$LISTBUILD返回的编码列表值。 $LISTBUILD创建的列表中的元素没有用字符定界符标记,因此可以包含任何字符。

SET $LISTBUILD

当在SET命令中等号的左侧使用时,$LISTBUILD函数将从列表中提取多个元素作为单个操作。语法如下:

SET $LISTBUILD(var1,var2,...)=list

$LISTBUILD的var参数是用逗号分隔的变量列表,每个变量都接收与其在$LISTBUILD参数列表中的位置相对应的list元素。 var参数不必是现有变量;在SET $LISTBUILD为其分配值时定义该变量。

  • var参数的数量可以小于或大于列表元素的数量。未指定的var值保留其先前值;如果以前未定义,则它们保持未定义。多余的列表元素将被忽略。
  • var参数和/或list元素可以包含省略的值,以占位符逗号表示。省略的var参数是未定义的。省略列表元素会导致相应的var值保留其先前值;如果以前未定义,则保持未定义。

SET $LISTBUILD是一个原子操作。 var参数的最大数量为128。尝试超过此数量将导致<SYNTAX>错误。

如果var参数是对象属性(object.property),则该属性必须是多维的。任何属性都可以在对象方法中引用为i%property实例变量。

在以下示例中,$LISTBUILD(在等号右侧)创建一个包含四个元素的列表。

在以下示例中,SET $LISTBUILD将列表中的前两个元素提取为两个变量:

/// d ##class(PHA.TEST.Function).LISTBUILD()
ClassMethod LISTBUILD()
{
   SET colorlist=$LISTBUILD("red","blue","green","white")
   SET $LISTBUILD(a,b)=colorlist
   WRITE "a=",a," b=",b   /* a="red" b="blue" */
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD()
a=red b=blue

在以下示例中,SET $LISTBUILD将列表中的元素提取为五个变量。由于指定的列表没有第5个元素,因此相应的var变量(e)包含其先前值:

/// d ##class(PHA.TEST.Function).LISTBUILD1()
ClassMethod LISTBUILD1()
{
    SET (a,b,c,d,e)=0
    SET colorlist=$LISTBUILD("red","blue","green","white")
    SET $LISTBUILD(a,b,c,d,e)=colorlist
    WRITE "a=",a," b=",b," c=",c," d=",d," e=",e
    /* a="red" b="blue" c="green" d="white" e=0 */
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD1()
a=red b=blue c=green d=white e=0

在下面的示例中,SET $LISTBUILD将列表中的元素提取为四个变量。由于指定的列表没有第三个元素,因此相应的var变量(c)包含其先前值:

/// d ##class(PHA.TEST.Function).LISTBUILD2()
ClassMethod LISTBUILD2()
{
    SET (a,b,c,d)=0
    SET colorlist=$LISTBUILD("red","blue",,"white")
    SET $LISTBUILD(a,b,c,d)=colorlist
    WRITE "a=",a," b=",b," c=",c," d=",d
    /* a="red" b="blue" c=0 d="white" */
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD2()
a=red b=blue c=0 d=white

在下面的示例中,SET $LISTBUILD将列表中的元素提取为四个变量。由于第三个列表元素值是嵌套列表,因此相应的var变量(c)包含一个列表值:

/// d ##class(PHA.TEST.Function).LISTBUILD3()
ClassMethod LISTBUILD3()
{
    SET (a,b,c,d)=0
    SET colorlist=$LISTBUILD("red","blue",$LISTBUILD("green","yellow"),"white")
    SET $LISTBUILD(a,b,c,d)=colorlist
    WRITE "a=",a," b=",b," c=",c," d=",d
    /* a="red" b="blue" c=$LB("green","yellow") d="white" */
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD3()
a=red b=blue c=greeyellow d=white

示例

这里显示的许多示例都使用``LISTTOSTRING`函数转换`LISTBUILD返回值以进行显示。$LISTBUILD`返回无法直接显示的编码字符串。

DHC-APP> SET colorlist=$LISTBUILD("Red","Blue","Green")
 
DHC-APP>WRITE $LISTTOSTRING(colorlist,"^")
Red^Blue^Green

下面的示例创建六个数字元素的列表,这些列表显示为“3^0^44^5.6^33^400”。请注意,$LISTBUILD基于优化的二进制表示形式对数字元素值进行编码,这可能与规范形式不同。列表显示功能(例如$LIST$LISTTOSTRING)以规范形式返回数字元素值:

DHC-APP>SET numlist=$LISTBUILD(003,0.00,44.0000000,5.6,+33,4E2)
 
DHC-APP>WRITE $LISTTOSTRING(numlist,"^")
3^0^44^5.6^33^400

省略元素

省略元素表达式定义了一个编码元素,但是该元素的数据值未定义。

在下面的示例中,$LISTBUILD语句均生成一个有效的三元素列表,其第二个元素具有未定义的值。省略元素并为元素指定未定义的变量会产生完全相同的结果。在任何一种情况下,使用任何列表函数(例如$LIST$LISTTOSTRING)引用第二个元素都会产生错误:

/// d ##class(PHA.TEST.Function).LISTBUILD4()
ClassMethod LISTBUILD4()
{
    KILL a
    SET list1=$LISTBUILD("Red",,"Green")
    SET list2=$LISTBUILD("Red",a,"Green")
    WRITE "List lengths:",$LISTLENGTH(list1)," ",$LISTLENGTH(list2),!
    IF $LISTVALID(list1)=1,$LISTVALID(list2)=1 {
        WRITE "有效 lists",! 
    }
    IF list1=list2 {
        WRITE "list相同"
    } ELSE {
        WRITE "list不相同"
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD4()
List lengths:3 3
有效 lists
list相同

以下示例显示可以在列表末尾以及列表内指定未定义的元素。带有尾部未定义元素的列表是有效列表。但是,使用任何列表函数引用此未定义元素都会产生<NULL VALUE>错误:

/// d ##class(PHA.TEST.Function).LISTBUILD5()
ClassMethod LISTBUILD5()
{
    KILL z
    SET list3=$LISTBUILD("Red",)
    SET list4=$LISTBUILD("Red",z)
    WRITE "List lengths:",$LISTLENGTH(list3)," ",$LISTLENGTH(list4),!
    IF $LISTVALID(list3)=1,$LISTVALID(list4)=1 {
        WRITE "有效 lists",! 
    }
    IF list3=list4 {
        WRITE "list相同"
    } ELSE {
        WRITE "list不相同"
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD5()
List lengths:2 2
有效 lists
list相同

但是,以下示例将生成一个三元素列表,其第二个元素具有数据值:空字符串。引用第二个元素时,不会发生错误情况:

/// d ##class(PHA.TEST.Function).LISTBUILD6()
ClassMethod LISTBUILD6()
{
    SET list5=$LISTBUILD("Red","","Green")
    SET list5len=$LISTLENGTH(list5)
    WRITE "List length: ",list5len,!
    FOR i=1:1:list5len {
        WRITE "Element ",i," value: ",$LIST(list5,i),! 
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD6()
List length: 3
Element 1 value: Red
Element 2 value:
Element 3 value: Green
 

没有数据或NULL空字符串数据的列表

使用$LISTBUILD创建的任何列表都至少包含一个编码列表元素。该元素可能包含或可能不包含数据。因为$LISTLENGTH是元素而不是数据,所以使用$LISTBUILD创建的任何列表的列表长度至少为1。

引用其数据值未定义的$LISTBUILD元素会生成错误。以下是创建“空”列表的所有有效$LISTBUILD语句。但是,尝试引用元素是这样的列表会导致<NULL VALUE>错误:

/// d ##class(PHA.TEST.Function).LISTBUILD7()
ClassMethod LISTBUILD7()
{
    TRY {
        SET x=$LISTBUILD(UndefinedVar)
        SET y=$LISTBUILD(,)
        SET z=$LISTBUILD()
        IF $LISTVALID(x)=1,$LISTVALID(y)=1,$LISTVALID(z)=1 {
            WRITE "无效 lists",! 
        }
        WRITE "$LB(UndefinedVar) contains ",$LISTLENGTH(x)," elements",!
        WRITE "$LB(,) contains ",$LISTLENGTH(y)," elements",!
        WRITE "$LB() contains ",$LISTLENGTH(z)," elements",!
        /* 使用null list */
        WRITE "$LB(UndefinedVar) list value ",$LISTTOSTRING(x,"^"),!
        WRITE "$LB(,) list value ",$LISTTOSTRING(y,"^"),!
        WRITE "$LB() list value ",$LISTTOSTRING(z,"^"),!
    }
    CATCH exp { WRITE !!,"在Cactch块",!
        IF 1=exp.%IsA("%Exception.SystemException") {
            WRITE "System exception",!
            WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
            WRITE "Location: ",exp.Location,!
            WRITE "Code: "
        } ELSE { 
            WRITE "其他异常",! RETURN 
        }
        WRITE exp.Code,!
        WRITE "Data: ",exp.Data,! 
        RETURN
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD7()
无效 lists
$LB(UndefinedVar) contains 1 elements
$LB(,) contains 2 elements
$LB() contains 1 elements
$LB(UndefinedVar) list value
 
在Cactch块
System exception
Name: &lt;NULL VALUE&gt;
Location: zLISTBUILD7+12^PHA.TEST.Function.1
Code: 137
Data:
 

以下是有效的$LISTBUILD语句,该语句创建包含数据的列表元素,尽管此数据具有空字符串值:

/// d ##class(PHA.TEST.Function).LISTBUILD8()
ClassMethod LISTBUILD8()
{
    SET x=$LISTBUILD("")
    WRITE "list contains ",$LISTLENGTH(x)," elements",!
    WRITE "list value is ",$LISTTOSTRING(x,"^"),!
    SET y=$LISTBUILD($CHAR(0))
    WRITE "list contains ",$LISTLENGTH(y)," elements",!
    WRITE "list value is ",$LISTTOSTRING(y,"^")
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD8()
list contains 1 elements
list value is
list contains 1 elements
list value is

嵌套LIST

列表的元素本身可以是列表。例如,以下语句生成一个三元素列表,其第三个元素是两元素列表“ Walnut,Pecan”

/// d ##class(PHA.TEST.Function).LISTBUILD9()
ClassMethod LISTBUILD9()
{
    SET nlist=$LISTBUILD("Apple","Pear",$LISTBUILD("Walnut","Pecan"))
    WRITE "嵌套 list 长度 is ",$LISTLENGTH($LIST(nlist,3)),!
    WRITE "满 list 长度 is ",$LISTLENGTH(nlist),!
    WRITE "List is ",$LISTTOSTRING(nlist,"^"),!
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD9()
嵌套 list 长度 is 2
满 list 长度 is 3
List is Apple^PearWalnutPecan
 

串联LIST

使用连接运算符(_)连接两个列表的结果是一个将两个列表组合在一起的列表。

在以下示例中,连接两个列表将创建一个列表,该列表与使用LISTBUILD创建的具有相同元素的列表相同:

/// d ##class(PHA.TEST.Function).LISTBUILD10()
ClassMethod LISTBUILD10()
{
    SET list1=$LISTBUILD("A","B")
    SET list2=$LISTBUILD("C","D","E")
    SET clist=list1_list2
    SET list=$LISTBUILD("A","B","C","D","E")
    IF clist=list {
        WRITE "相同",!
    } ELSE {
        WRITE "不同",!
    }
    WRITE "串联 ",$LISTTOSTRING(clist,"^"),!
    WRITE "相同LIST ",$LISTTOSTRING(list,"^")
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD10()
相同
串联 A^B^C^D^E
相同LIST A^B^C^D^E

不能将字符串连接到列表。尝试这样做会在第一次尝试访问结果时生成错误:

/// d ##class(PHA.TEST.Function).LISTBUILD11()
ClassMethod LISTBUILD11()
{
    TRY {
        SET list=$LISTBUILD("A","B")_"C"
        WRITE "$LISTBUILD 完成没有错误",!
        SET listlen=$LISTLENGTH(list)
        WRITE "$LISTLENGTH 完成没有错误",!
        SET listval=$LISTTOSTRING(list,"^")
        WRITE "$LISTTOSTRING 完成没有错误",!
    }
    CATCH exp { WRITE !!,"在Catch中",!
        IF 1=exp.%IsA("%Exception.SystemException") {
            WRITE "系统异常",!
            WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
            WRITE "Location: ",exp.Location,!
            WRITE "Code: "
        } ELSE { 
            WRITE "其他异常",! RETURN 
        }
        WRITE exp.Code,!
        WRITE "Data: ",exp.Data,! 
        RETURN
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LISTBUILD11()
$LISTBUILD 完成没有错误
 
 
在Catch中
系统异常
Name: &lt;LIST&gt;
Location: zLISTBUILD11+4^PHA.TEST.Function.1
Code: 81
Data:
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343