第二十六章 Caché 函数大全 $LIST 函数

2020-09-16  本文已影响0人  Cache技术分享

第二十六章 Caché 函数大全 $LIST 函数

返回或替换列表中的元素。

大纲

$LIST(list,position,end) 
$LI(list,position,end)  

SET $LIST(list,position,end)=value 
SET $LI(list,position,end)=value

参数

描述

$LIST可以通过两种方式使用:

返回列表元素

$LIST返回列表中的单个元素或元素范围。返回的元素取决于所使用的参数。

指定的位置不能是列表末尾以外的正整数,也不能是列表开头前的负整数。指定的末尾可以是列表末尾以外的正整数,但仅返回现有的列表元素。不执行元素填充。

注意:不应在循环结构中使用$LIST返回多个连续的元素值。尽管这可以工作,但效率非常低,因为$LIST必须在每次迭代的开始就计算该列表。$LISTNEXT函数是返回多个连续元素值的更有效的方法。

参数

list

包含一个或多个元素的编码列表字符串。可以使用$LISTBUILD$LISTFROMSTRING创建列表,也可以使用$LIST函数从另一个列表中提取列表。 (空字符串(“”)和某些$CHAR非打印字符组合,例如$CHAR(1)$CHAR(2,1)和$CHAR(3,1,asciicode)也可以返回已编码的空字符或单元素列表。)。

返回一个或多个元素时,列表可以是变量或对象属性。

$LIST与等号左侧的SET一起使用以替换一个或多个元素时,list可以是变量或多维属性引用;它不能是非多维对象属性。

以下是有效的列表参数:

/// d ##class(PHA.TEST.Function).LIST()
ClassMethod LIST()
{
    SET myList = $LISTBUILD("Red","Blue","Green","Yellow")
    WRITE !,$LIST(myList,2)   ; prints Blue
    SET subList = $LIST(myList,2,4)
    WRITE !,$LIST(subList,2)  ; prints Green
}

DHC-APP>d ##class(PHA.TEST.Function).LIST()
 
Blue
Green

在下面的示例中,subList不是有效的列表参数,因为它是作为普通字符串而不是编码的列表字符串返回的单个元素:

/// d ##class(PHA.TEST.Function).LIST1()
ClassMethod LIST1()
{
    SET myList = $LISTBUILD("Red","Blue","Green","Yellow")
    SET subList = $LIST(myList,2)
    WRITE $LIST(subList,1)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST1()
 
 WRITE $LIST(subList,1) }
 ^
<LIST>zLIST1+3^PHA.TEST.Function.1

SET $LIST语法格式中,list不能是非多维对象属性。

position

要返回(或替换)的列表元素的位置(元素计数)。单个元素作为字符串返回。列表元素从1开始计数。如果省略position,则$LIST返回第一个元素。

如果指定了end参数,则position指定元素范围中的第一个元素。一定范围的元素总是作为编码列表字符串返回。即使仅返回一个元素(当位置和结尾为相同数字时),该值也作为编码列表字符串返回。因此,$LIST(x,2)是与$LIST(x,2,2)相同的元素,但数据值不同。

end

最后一个元素在一系列元素中的位置,指定为整数。必须指定位置以指定结束。如果end是小数,则将其截断为整数部分。

指定end时,返回的值是编码列表字符串。由于这种编码,这样的字符串只能由其他$LIST函数处理。

不推荐使用–1

在较旧的代码中,位置或最终值为-1表示列表中的最后一个元素。值-1不能与** + n* -n语法一起使用。

指定* -n* + n参数值

使用变量指定* -n* + n时,必须始终在参数本身中指定星号和符号字符。

以下是* -n的有效规格:

/// d ##class(PHA.TEST.Function).LIST2()
ClassMethod LIST2()
{
    SET count=2
    SET alph=$LISTBUILD("a","b","c","d")
    WRITE $LIST(alph,*-count)
}

DHC-APP>d ##class(PHA.TEST.Function).LIST2()
b
/// d ##class(PHA.TEST.Function).LIST3()
ClassMethod LIST3()
{
    SET count=-2
    SET alph=$LISTBUILD("a","b","c","d")
    WRITE $LIST(alph,*+count)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST3()
b

以下是* + n的有效规范:

/// d ##class(PHA.TEST.Function).LIST4()
ClassMethod LIST4()
{
    SET count=2
    SET alph=$LISTBUILD("a","b","c","d")
    SET $LIST(alph,*+count)="F"
    WRITE $LISTTOSTRING(alph,"^",1)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST4()
a^b^c^d^^F

这些参数值内允许使用空格。

$LIST错误

以下$LIST参数值会产生错误:

/// d ##class(PHA.TEST.Function).LIST5()
ClassMethod LIST5()
{
    // 以下均会发生错误
    WRITE $LIST(""),!
    WRITE $LIST($LB()),!
    WRITE $LIST($LB(UndefinedVar)),!
    WRITE $LIST($LB(,))
    WRITE $LIST($LB()_$LB("a","b","c"))
}

DHC-APP>d ##class(PHA.TEST.Function).LIST5()
 
 WRITE $LIST(""),!
 ^
<NULL VALUE>zLIST5+1^PHA.TEST.Function.1

如果$LIST(list,position)语法position参数指定一个null(不存在)元素,则$LIST会生成一个错误,因为此语法试图将null值作为字符串返回:

/// d ##class(PHA.TEST.Function).LIST6()
ClassMethod LIST6()
{
    SET mylist=$LISTBUILD("A",,"C")
    ZZDUMP $LIST(mylist,2)  ; generates a <NULL VALUE> error
}
DHC-APP>d ##class(PHA.TEST.Function).LIST6()
 
 ZZDUMP $LIST(mylist,2)  ; generates a <NULL VALUE> error
 ^
<NULL VALUE>zLIST6+2^PHA.TEST.Function.1

/// d ##class(PHA.TEST.Function).LIST7()
ClassMethod LIST7()
{
    SET mylist2=$LISTBUILD("A","B","C")
    WRITE $LIST(mylist2,4) ; generates a <NULL VALUE> error
}
DHC-APP 2d1>d ##class(PHA.TEST.Function).LIST7()
 
 WRITE $LIST(mylist2,4) ; generates a <NULL VALUE> error
 ^
<NULL VALUE>zLIST7+2^PHA.TEST.Function.1
/// d ##class(PHA.TEST.Function).LIST8()
ClassMethod LIST8()
{
    SET list2=$LISTBUILD("Brown","Black")
    WRITE $LIST(list2,*-2) ; generates a <NULL VALUE> error
    WRITE $LIST(list2,*-3) ; generates a <RANGE> error
}
DHC-APP>d ##class(PHA.TEST.Function).LIST8()
 
 WRITE $LIST(list2,*-2) ; generates a <NULL VALUE> error
 ^
<NULL VALUE>zLIST8+2^PHA.TEST.Function.1
DHC-APP 2d1>d ##class(PHA.TEST.Function).LIST8()
 
 WRITE $LIST(list2,*-3) ; generates a <RANGE> error
 ^
<RANGE>zLIST8+3^PHA.TEST.Function.1

因为$LISTLENGTH(“”)为0,所以* -1或更大的位置或结尾将导致错误:

DHC-APP>WRITE $LIST("",*-0)
 
WRITE $LIST("",*-0)
^
<NULL VALUE>
DHC-APP>WRITE $LIST("",*-1)
 
WRITE $LIST("",*-1)
^
<RANGE>
DHC-APP>WRITE $LIST("",0,*-1)
 

使用SET $LIST替换元素

$LIST与等号左侧的SET一起使用时,list可以是有效的变量名。如果变量不存在,则SET $LIST对其进行定义。 list参数也可以是多维属性引用;它不能是非多维对象属性。尝试在非多维对象属性上使用SET $LIST会导致<OBJECT DISPATCH>错误。

如果函数使用相对偏移语法,则不能将SET(a,b,c,...)= value语法与等号左侧的$LIST(或$PIECE或$EXTRACT)一起使用:*表示结尾一个字符串,*-n* + n代表距字符串末尾的相对偏移量。必须改为使用SET a = valueb = valuec = value,...语法。

还可以使用$LISTUPDATE替换列表中的一个或多个元素,或按元素位置将元素追加到列表中。 $LISTUPDATE替换列表元素,对每个元素替换执行布尔测试。与SET $LIST不同,$LISTUPDATE不会修改初始列表,而是返回带有指定元素替换的该列表的副本。

两参数运算

可以执行以下两个参数操作。注意,两参数运算将元素值指定为字符串。将元素值指定为列表会在列表中创建一个子列表。

/// w ##class(PHA.TEST.Function).listSpace(" a  b  c 姚 鑫 1  2    3  ")
ClassMethod listSpace(str)
{
    s newStr = $lts($lfs(str," "),"")
    q newStr
}
DHC-APP>w ##class(PHA.TEST.Function).listSpace(" a  b  c 姚 鑫 1  2    3  ")
abc姚鑫123
SET $LIST(fruit,2)=""
 SET $LIST(fruit,*+1)="plum"
 SET $LIST(fruit,3)=$LISTBUILD("orange","banana")

三参数运算

可以执行以下三参数(范围)操作。请注意,即使指定单个元素值,范围操作也将元素值指定为列表。

SET $LIST(fruit,3,3)=$LISTBUILD("orange","banana")
SET $LIST(fruit,2,3)=$LISTBUILD("orange","banana")
SET $LIST(fruit,2,3)=$LISTBUILD("orange","banana","peach")
SET $LIST(fruit,2,3)=$LISTBUILD("","")
SET $LIST(fruit,2,3)=""
SET $LIST(fruit,*+1,*+2)=$LISTBUILD("plum","pear")

SET $LIST仅附加指定的元素值。如果结束位置大于指定的元素,则不会创建空的尾随元素位置。

示例

$LIST返回元素的示例

以下示例使用$LIST的2参数形式返回列表元素作为字符串:

以下两个$LIST语句返回“Red”,即列表中的第一个元素。默认情况下,第一个返回第一个元素,第二个返回第一个元素,因为position参数设置为1。该值以字符串形式返回:

/// d ##class(PHA.TEST.Function).LIST9()
ClassMethod LIST9()
{
    SET colorlist=$LISTBUILD("Red","Orange","Yellow","Green","Blue","Violet")
    WRITE $LIST(colorlist),!
    WRITE $LIST(colorlist,1)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST9()
Red
Red

以下两个$LIST语句返回“Orange”,即列表中的第二个元素。第一个从列表的开头算起,第二个从列表的末尾算起。该值以字符串形式返回:

/// d ##class(PHA.TEST.Function).LIST10()
ClassMethod LIST10()
{
    SET colorlist=$LISTBUILD("Red","Orange","Yellow","Green","Blue","Violet")
    WRITE $LIST(colorlist,2),!
    WRITE $LIST(colorlist,*-4)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST10()
Orange
Orange

以下示例使用$LIST的3参数形式返回一个或多个元素作为编码列表字符串。由于列表包含非打印编码字符,因此必须使用$LISTTOSTRING将子列表转换为可打印的字符串。

以下两个$LIST语句返回“Blue”,即列表中的第五个元素,作为编码后的列表字符串。第一个从列表的开头算起,第二个从列表的末尾算起。由于该元素被指定为范围,因此将其检索为包含一个元素的列表:

/// d ##class(PHA.TEST.Function).LIST11()
ClassMethod LIST11()
{
    SET colorlist=$LISTBUILD("Red","Orange","Yellow","Green","Blue","Violet")
    WRITE $LISTTOSTRING($LIST(colorlist,5,5))
    WRITE $LISTTOSTRING($LIST(colorlist,*-1,*-1))
}
DHC-APP>d ##class(PHA.TEST.Function).LIST11()
BlueBlue

下面的示例返回“Red Orange Yellow”,这是一个三元素的列表字符串,从列表中的第一个元素开始,以第三个元素结束:

DHC-APP>SET colorlist=$LISTBUILD("Red","Orange","Yellow","Green","Blue","Violet")
 
DHC-APP>WRITE $LISTTOSTRING($LIST(colorlist,1,3))
Red,Orange,Yellow

以下示例返回“ Green Blue Violet”,这是一个三元素的列表字符串,从列表中的第四个元素开始,到最后一个元素结束:

DHC-APP>SET colorlist=$LISTBUILD("Red","Orange","Yellow","Green","Blue","Violet")
DHC-APP>WRITE $LISTTOSTRING($LIST(colorlist,4,*))
Green,Blue,Violet

以下示例从属性返回列表元素:

/// d ##class(PHA.TEST.Function).LIST12()
ClassMethod LIST12()
{
    SET cfg=##class(%iKnow.Configuration).%New("Trilingual",1,$LB("en","ch","es"))
    WRITE $LIST(cfg.Languages,2)
}

使用SET $LIST替换,删除或附加元素的示例

下面的示例显示SET $LIST替换第二个元素:

/// d ##class(PHA.TEST.Function).LIST13()
ClassMethod LIST13()
{
    SET fruit=$LISTBUILD("apple","onion","banana","pear")
    WRITE !,$LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,2)="orange"
    WRITE !,$LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST13()
 
apple/onion/banana/pear
apple/orange/banana/pear

下面的示例显示SET $LIST替换第二和第三个元素:

/// d ##class(PHA.TEST.Function).LIST14()
ClassMethod LIST14()
{
    SET fruit=$LISTBUILD("apple","potato","onion","pear")
    WRITE !,$LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,2,3)=$LISTBUILD("orange","banana")
    WRITE !,$LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST14()
 
apple/potato/onion/pear
apple/orange/banana/pear

下面的示例显示SET $LIST用四个元素替换第二个和第三个元素:

/// d ##class(PHA.TEST.Function).LIST15()
ClassMethod LIST15()
{
    SET fruit=$LISTBUILD("apple","potato","onion","pear")
    WRITE !,$LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,2,3)=$LISTBUILD("orange","banana","peach","tangerine")
    WRITE !,$LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST15()
 
apple/potato/onion/pear
apple/orange/banana/peach/tangerine/pear

以下示例显示SET $LIST将元素追加到列表的末尾:

/// d ##class(PHA.TEST.Function).LIST16()
ClassMethod LIST16()
{
    SET fruit=$LISTBUILD("apple","orange","banana","peach")
    WRITE $LL(fruit)," ",$LISTTOSTRING(fruit,"/",1),!
    SET $LIST(fruit,*+1)="pear"
    WRITE $LL(fruit)," ",$LISTTOSTRING(fruit,"/",1)
}

DHC-APP>d ##class(PHA.TEST.Function).LIST16()
4 apple/orange/banana/peach
5 apple/orange/banana/peach/pear

下面的示例显示SET $LIST在列表末尾的三个位置附加一个元素:

/// d ##class(PHA.TEST.Function).LIST17()
ClassMethod LIST17()
{
    SET fruit=$LISTBUILD("apple","orange","banana","peach")
    WRITE $LL(fruit)," ",$LISTTOSTRING(fruit,"/",1),!
    SET $LIST(fruit,*+3)="tangerine"
    WRITE $LL(fruit)," ",$LISTTOSTRING(fruit,"/",1)
}
DHC-APP>d ##class(PHA.TEST.Function).LIST17()
4 apple/orange/banana/peach
7 apple/orange/banana/peach///tangerine

以下四个示例显示了使用* -n语法的SET $LIST,以元素从列表末尾的偏移量替换元素。请注意,SET $LIST(x,*-n)SET $LIST(x,n,*-n)执行不同的操作:SET $LIST(x,*-n)替换指定元素的值; SET $LIST( x,n,*-n)删除指定范围的元素,然后追加指定列表。

要将倒数第二个元素替换为单个值,请使用SET $LIST(x,*-1)

/// d ##class(PHA.TEST.Function).LIST18()
ClassMethod LIST18()
{
    SET fruit=$LISTBUILD("apple","banana","orange","potato","pear")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,*-1)="peach"
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST18()
 
list length is 5 apple/banana/orange/potato/pear
list length is 5 apple/banana/orange/peach/pear

要从列表末尾按偏移量删除单个元素,请使用SET $LIST(x,*-n,*-n)=“”


/// d ##class(PHA.TEST.Function).LIST19()
ClassMethod LIST19()
{
    SET fruit=$LISTBUILD("apple","banana","orange","potato","pear")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,*-1,*-1)=""
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST19()
 
list length is 5 apple/banana/orange/potato/pear
list length is 4 apple/banana/orange/pear

要将单个元素从列表末尾的偏移量替换为元素列表,请使SET $LIST(x,*-n,*-n)= list

/// d ##class(PHA.TEST.Function).LIST20()
ClassMethod LIST20()
{
    SET fruit=$LISTBUILD("apple","banana","potato","orange","pear")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,*-2,*-2)=$LISTBUILD("peach","plum","quince")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST20()
 
list length is 5 apple/banana/potato/orange/pear
list length is 7 apple/banana/peach/plum/quince/orange/pear

要将单个元素替换为列表末尾的子列表,请使用SET $LIST(x,*-n)= list

/// d ##class(PHA.TEST.Function).LIST21()
ClassMethod LIST21()
{
    SET fruit=$LISTBUILD("apple","banana","potato","orange","pear")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,*-2)=$LISTBUILD("peach","plum","quince")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
}

DHC-APP> d ##class(PHA.TEST.Function).LIST21()
 
list length is 5 apple/banana/potato/orange/pear
list length is 5 apple/banana/peach�pluquince/orange/pear

下面的示例显示SET $LIST从列表中删除元素,从第三个元素到列表末尾:


/// d ##class(PHA.TEST.Function).LIST22()
ClassMethod LIST22()
{
    SET fruit=$LISTBUILD("apple","orange","onion","peanut","potato")
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
    SET $LIST(fruit,3,*)=""
    WRITE !,"list length is ",$LISTLENGTH(fruit)," "
    WRITE $LISTTOSTRING(fruit,"/")
}
DHC-APP>d ##class(PHA.TEST.Function).LIST22()
 
list length is 5 apple/orange/onion/peanut/potato
list length is 2 apple/orange

注意

Unicode

如果一个Unicode字符出现在列表元素中,则整个列表元素将表示为Unicode(宽)字符。列表中的其他元素不受影响。

以下示例显示了两个列表。 y列表由两个仅包含ASCII字符的元素组成。 z列表由两个元素组成:第一个元素包含Unicode字符($CHAR(960)= pi符号);第二个元素包含Unicode字符。第二个元素仅包含ASCII字符。

/// d ##class(PHA.TEST.Function).LIST23()
ClassMethod LIST23()
{
    IF $SYSTEM.Version.IsUnicode()  {
        SET y=$LISTBUILD("ABC"_$CHAR(68),"XYZ")
        SET z=$LISTBUILD("ABC"_$CHAR(960),"XYZ")
        WRITE !,"The ASCII list y elements: "
        ZZDUMP $LIST(y,1)
        ZZDUMP $LIST(y,2)
        WRITE !,"The Unicode list z elements: "
        ZZDUMP $LIST(z,1)
        ZZDUMP $LIST(z,2)
    }
    ELSE {WRITE "此示例需要Caché的Unicode安装"}
}
DHC-APP>d ##class(PHA.TEST.Function).LIST23()
 
The ASCII list y elements:
0000: 41 42 43 44                                             ABCD
0000: 58 59 5A                                                XYZ
The Unicode list z elements:
0000: 0041 0042 0043 03C0                                     ABCπ
0000: 58 59 5A                                                XYZ

请注意,Caché完全使用宽Unicode字符对z的第一个元素进行编码。 z的第二个元素不包含Unicode字符,因此Caché使用狭窄的ASCII字符对其进行编码。

$LIST$EXTRACT$PIECE相比

$LIST通过从列表的开头(或结尾)开始计数元素(而非字符)来确定编码列表中的元素。

$EXTRACT通过从字符串的开头(或结尾)开始计数字符来确定子字符串。 $EXTRACT将普通字符串作为输入。

$PIECE通过计算字符串中用户定义的定界符来确定子字符串。 $PIECE将包含要用作定界符的一个或多个字符实例的普通字符串作为输入。

$LIST不能用于普通字符串。 $PIECE$EXTRACT不能用于编码列表。

上一篇 下一篇

猜你喜欢

热点阅读