第四十九章 Caché 函數大全 $PIECE 函數
使用定界符返回或替換子字符串。
大綱
$PIECE(string,delimiter,from,to)
$P(string,delimiter,from,to)
SET $PIECE(string,delimiter,from,to)=value
SET $P(string,delimiter,from,to)=value
參數
- string 標識分隔的子字符串的目標字符串。將字符串指定爲計算結果爲帶引號的字符串或數字值的表達式。在
SET $PIECE
語法中,字符串必須是變量或多維屬性。 - 用於標識字符串中子字符串的定界符。將定界符指定爲一個表達式,該表達式的結果爲包含一個或多個字符的帶引號的字符串。
- from 可選-表達式的計算結果爲指定字符串中子字符串的位置或子字符串範圍的開頭的代碼。子字符串由定界符分隔,並從1開始計數。允許的值爲
n
(正整數,指定從字符串開頭的子字符串計數),*
(指定字符串中的最後一個子字符串)和* -n
(偏移整數計數)。從字符串末尾開始倒數的子字符串)。SET $PIECE
語法還支持* + n
(要追加到字符串末尾的子字符串的偏移整數計數)。因此,第一個定界子串是1,第二個定界子串是2,最後一個定界子串是*
,倒數第二個定界子串是* -1
。如果忽略from,則默認爲第一個帶分隔符的子字符串。 - to 可選—一個表達式,其計算結果爲指定字符串中一系列子字符串的結尾子字符串的代碼。必須與from一起使用。允許的值爲
n
(從字符串開頭指定子字符串計數的正整數),*
(指定字符串中最後一個子字符串)和* -n
(從字符串末尾偏移的子字符串整數)。SET $PIECE
語法還支持* + n
(用於附加到字符串末尾的一系列子字符串的偏移整數)。如果to在字符串中位於from之前,則不執行任何操作,也不產生錯誤。
描述
$PIECE
通過分隔符的存在來標識字符串中的子字符串。如果分隔符未出現在字符串中,則整個字符串將被視爲單個子字符串。
$PIECE
可以通過兩種方式使用:
- 從字符串返回子字符串。這使用
$PIECE(string,delimiter,from,to)
語法。 - 替換字符串中的子字符串。它標識一個子字符串並將其替換爲另一個子字符串。替換子字符串的長度可以與原始子字符串相同,更長或更短。這使用
$PIECE(string,delimiter,from,to) = value
語法。
注意:$PIECE
是用於處理包含定界子字符串的字符串的通用函數。若要處理包含特定MultiValue定界符的MultiValue動態數組字符串,請使用$MV
函數。
返回一個子字符串。
從字符串返回指定的子字符串(片斷)時,返回的子字符串取決於所使用的參數:
-
$PIECE(string,delimiter)
返回字符串中的第一個子字符串。如果定界符出現在字符串中,則這是第一次出現定界符之前的子字符串。如果字符串中未出現定界符,則返回的子字符串爲字符串。 -
$PIECE(string,delimiter,from)
返回一個子字符串,其位置由from參數指定。子字符串由定界符以及字符串的開頭和結尾定界。分隔符本身不返回。 -
$PIECE(string,delimiter,from,to)
返回一系列子字符串,包括從中指定的子字符串到in至(包括)中指定的子字符串。$PIECE
的這種四參數形式返回一個子字符串,該子字符串包括在from和to子字符串之間出現的定界符的任何中間出現。如果to大於子字符串的數量,則返回的子字符串將包括字符串末尾的所有子字符串。
參數
string
當使用$PIECE
返回子字符串時,string可以是用引號引起來的字符串文字,規範數字,變量,對象屬性或任何求值爲字符串或數字的有效ObjectScript表達式。如果將空字符串(“”
)指定爲目標字符串,則$PIECE始終返回該空字符串,而不考慮其他參數值。
目標字符串通常包含用作分隔符的字符(或字符串)實例。此字符或字符串也不能用作字符串中的數據值。
當$PIECE
與等號左側的SET
一起使用以替換子字符串時,string可以是變量或多維屬性引用。它不能是非多維對象屬性。
delimiter
用於在字符串中定界子字符串的搜索字符串。它可以是用引號引起來的字符串文字,規範的數字,變量或任何有效的ObjectScript表達式(其結果爲字符串或數字)。
通常,定界符是一個指定字符,從不用作字符串中的數據,而是專門留出用作分隔子字符串的定界符。例如,如果定界符爲“^”
,則字符串“Red^Orange^Yellow”
包含三個定界子字符串。
分隔符可以是多字符字符串,可以在字符串數據中使用其各個字符。例如,如果定界符爲“^#”
,則字符串“Red^Orange^#^Yellow#Green#^Blue”
包含兩個定界子字符串:“Red^Orange”
和“^Yellow#Green#^Blue”
。
通常,字符串不以定界符開頭或結尾。如果字符串以分隔符開始或結束,則$PIECE
將此分隔符視爲使用空字符串(“”
)值劃分子字符串。例如,如果定界符爲“^”
,則字符串“^Red^Orange^Yellow^”
包含五個定界子字符串;子字符串1和5具有空字符串值。
如果指定的定界符不在字符串中,則$PIECE
返回整個字符串。如果指定的分隔符是空字符串(“”
),則$PIECE
返回空字符串。
from
子字符串在字符串中的位置。使用n
(正整數)從字符串開頭算起定界的子字符串。使用*
指定字符串中最後一個定界的子字符串。使用* -n
通過與字符串中最後一個分隔的子字符串的偏移量來計數分隔的子字符串。
- 1指定字符串的第一個子字符串(在第一次出現定界符之前的子字符串)。如果string不包含指定的分隔符,則from值1將返回string。如果忽略from,則默認爲1。
- 2指定字符串的第二個子字符串(出現在分隔符的第一次和第二次出現之間,或第一次出現的分隔符和字符串結尾之間的子字符串)。
-
*
指定字符串的最後一個子字符串(最後一次出現定界符之後的子字符串)。如果string不包含指定的分隔符,則from值*
會返回string。 -
*-1
指定字符串的倒數第二個子字符串。* -n
通過相對於字符串最後一個子字符串的偏移量進行計數。* -0
是字符串的最後一個子字符串;*
和* -0
在功能上相同。 - 僅適用於
SET $PIECE
語法—* + n
(星號後跟一個正數)將定界的子字符串附加偏移量,超出字符串末尾。因此,* + 1
在字符串末尾附加一個帶分隔符的子字符串,* + 2
在字符串末尾兩個位置附加一個分隔的子字符串,並用定界符填充。 - 如果from是空字符串(
“”
),零,負數,或者指定了超出字符串中子字符串數量的計數或偏移量,則$PIECE
返回空字符串。
$PIECE
將a從數字形式轉換爲規範形式(解析前導正負號並刪除前導零),然後將其截斷爲整數。
如果from參數與to參數一起使用,則它將標識要作爲字符串返回的子字符串範圍的開始,並且應小於to的值。
to
字符串中子字符串的編號,該字符串終止由from參數啓動的範圍。返回的字符串包括from和to子字符串,以及任何中間子字符串和分隔它們的定界符。 to參數必須與from一起使用,並且應大於from的值。
使用n
(正整數)從字符串開頭算起定界的子字符串。使用*
指定字符串中最後一個定界的子字符串。使用* -n
通過從字符串中最後一個帶分隔符的子字符串向後偏移來計數帶分隔符的子字符串。
僅對於SET $PIECE語法-* + n
(星號後跟一個正數)指定要附加到字符串末尾之外的子字符串範圍的末尾。
- 如果from小於to,則
$PIECE
返回一個字符串,該字符串包括此範圍內的所有帶分隔符的子字符串,包括from和to子字符串。返回的字符串包含此範圍內的子字符串和定界符。如果to大於分隔的子字符串的數量,則返回的字符串包含從from子字符串開始,一直到字符串末尾的所有字符串數據(子字符串和定界符)。 - 如果from等於to,則
$PIECE
返回from子字符串。如果from和to是相同的值,或者是引用相同子字符串的不同值,則可能發生這種情況。 - 如果from大於to,爲零(0),或者爲空字符串(
“”
),則$PIECE
返回一個空字符串。
$PIEC
E將a轉換爲標準格式(解析前導正負號並刪除前導零),然後將其截斷爲整數。
指定* -n
和* + n
參數值
使用變量指定* -n
或* + n
時,必須始終在參數本身中指定星號和符號字符。
以下是* -n
的有效規格:
/// d ##class(PHA.TEST.Function).PIECE()
ClassMethod PIECE()
{
SET count=2
SET alph="a^b^c^d"
WRITE $PIECE(alph,"^",*-count)
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE()
b
/// d ##class(PHA.TEST.Function).PIECE1()
ClassMethod PIECE1()
{
SET count=-2
SET alph="a^b^c^d"
WRITE $PIECE(alph,"^",*+count)
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE1()
b
以下是* + n
的有效規範:
/// d ##class(PHA.TEST.Function).PIECE2()
ClassMethod PIECE2()
{
SET count=2
SET alph="a^b^c^d"
SET $PIECE(alph,"^",*+count)="F"
WRITE alph
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE2()
a^b^c^d^^F
這些參數值內允許使用空格。
示例:返回帶分隔符的子字符串
在下面的示例中,每個$PIECE
返回指定的子字符串,該子字符串由“,”
定界符標識:
/// d ##class(PHA.TEST.Function).PIECE3()
ClassMethod PIECE3()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
WRITE $PIECE(colorlist,","),! ; returns "Red" (substring 1) by default
WRITE $PIECE(colorlist,",",3),! ; returns "Blue" the third substring
WRITE $PIECE(colorlist,",",*),! ; returns "Black" the last substring
WRITE $PIECE(colorlist,",",*-1),! ; returns "Orange" the next-to-last substring
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE3()
Red
Blue
Black
Orange
在下面的示例中,$PIECE
返回數字的整數和小數部分:
/// d ##class(PHA.TEST.Function).PIECE4()
ClassMethod PIECE4()
{
SET int=$PIECE(123.999,".")
SET frac=$PIECE(123.999,".",*)
WRITE "integer=",int," fraction =.",frac
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE4()
integer=123 fraction =.999
下面的示例返回“Blue,Yellow,Orange”
,即顏色列表中的第三到第五個子字符串,用“,”
分隔:
/// d ##class(PHA.TEST.Function).PIECE5()
ClassMethod PIECE5()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
SET extract=$PIECE(colorlist,",",3,5)
WRITE extract
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE5()
Blue,Yellow,Orange
以下WRITE
語句均返回第一個子字符串“123”
,表明當from的值等於1時,這些格式是等效的:
/// d ##class(PHA.TEST.Function).PIECE6()
ClassMethod PIECE6()
{
SET numlist="123#456#789"
WRITE !,"2-arg=",$PIECE(numlist,"#")
WRITE !,"3-arg=",$PIECE(numlist,"#",1)
WRITE !,"4-arg=",$PIECE(numlist,"#",1,1)
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE6()
2-arg=123
3-arg=123
4-arg=123
在下面的示例中,兩個$PIECE
函數都返回整個字符串字符串,因爲在字符串中沒有出現定界符:
/// d ##class(PHA.TEST.Function).PIECE7()
ClassMethod PIECE7()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
SET extract1=$PIECE(colorlist,"#")
SET extract2=$PIECE(colorlist,"#",1,4)
WRITE "# =",extract1,!,"#,1,4=",extract2
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE7()
# =Red,Green,Blue,Yellow,Orange,Black
#,1,4=Red,Green,Blue,Yellow,Orange,Black
以下示例$PIECE
從對象屬性返回第二個子字符串:
/// d ##class(PHA.TEST.Function).PIECE8()
ClassMethod PIECE8()
{
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SchemaPath="MyTests,Sample,Cinema"
WRITE "whole schema path: ",tStatement.%SchemaPath,!
WRITE "2nd piece of schema path: ",$PIECE(tStatement.%SchemaPath,",",2),!
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE8()
whole schema path: MyTests,Sample,Cinema
2nd piece of schema path: Sample
以下兩個示例使用更復雜的定界符。
本示例使用定界符字符串“#-#”
返回字符串numlist
的三個子字符串。此處,定界字符串的組成字符“#”
和“-”
可用作數據值;僅保留指定的字符序列(#-#
):
/// d ##class(PHA.TEST.Function).PIECE9()
ClassMethod PIECE9()
{
SET numlist="1#2-3#-#45##6#-#789"
WRITE !,$PIECE(numlist,"#-#",1)
WRITE !,$PIECE(numlist,"#-#",2)
WRITE !,$PIECE(numlist,"#-#",3)
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE9()
1#2-3
45##6
789
下面的示例使用一個非ASCII
分隔符(在本例中爲pi
的Unicode字符),該字符通過$CHAR
函數指定,並通過連接運算符(_
)插入到字符串中:
/// d ##class(PHA.TEST.Function).PIECE10()
ClassMethod PIECE10()
{
IF $SYSTEM.Version.IsUnicode() {
SET a = $CHAR(960)
SET colorlist="Red"_a_"Green"_a_"Blue"
SET extract1=$PIECE(colorlist,a)
SET extract2=$PIECE(colorlist,a,2)
SET extract3=$PIECE(colorlist,a,2,3)
WRITE extract1,!,extract2,!,extract3
} ELSE {
WRITE "此示例需要Caché的Unicode安裝"
}
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE10()
Red
Green
GreenπBlue
使用SET $PIECE替換子字符串
使用SET
命令進行分配時,可以在等號的左側和右側使用$PIECE
。在等號左側使用時,$PIECE
指定要由分配的值替換的子字符串。
當$PIECE
與等號左側的SET一起使用時,字符串可以是有效的變量名。如果該變量不存在,則SET $PIECE
對其進行定義。字符串參數也可以是多維屬性引用。它不能是非多維對象屬性。嘗試在非多維對象屬性上使用SET $PIECE
會導致<OBJECT DISPATCH>
錯誤。
在這種情況下,$PIECE
(以及$LIST
和$EXTRACT
)的使用不同於其他標準函數,因爲它修改了一個現有值,而不是僅僅返回一個值。如果函數使用相對偏移語法,則不能將SET(a,b,c,...)= value
語法與等號左邊的$PIECE(或$LIST或$EXTRACT)
一起使用:*
表示結尾一個字符串,*-n
或* + n
代表距字符串末尾的相對偏移量。必須改爲使用SET a = value,b = value,c = value
,...語法。
示例:替換分隔的子字符串
以下示例將顏色列表的值更改爲"Magenta,Green,Cyan,Yellow,Orange,Black"
:
/// d ##class(PHA.TEST.Function).PIECE11()
ClassMethod PIECE11()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
WRITE colorlist,!
SET $PIECE(colorlist,",",1)="Magenta"
WRITE colorlist,!
SET $PIECE(colorlist,",",*-3)="Cyan"
WRITE colorlist,!
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE11()
Red,Green,Blue,Yellow,Orange,Black
Magenta,Green,Blue,Yellow,Orange,Black
Magenta,Green,Cyan,Yellow,Orange,Black
當然,替換子字符串可以比原始子字符串長或短,並且可以包括定界符:
/// d ##class(PHA.TEST.Function).PIECE12()
ClassMethod PIECE12()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
WRITE colorlist,!
SET $PIECE(colorlist,",",3)="Turquoise,Aqua,Teal"
WRITE colorlist,!
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE12()
Red,Green,Blue,Yellow,Orange,Black
Red,Green,Turquoise,Aqua,Teal,Yellow,Orange,Black
如果指定了from和to參數,則將包含的子字符串替換爲指定的值,在這種情況下,是第4到第6個定界子字符串:
/// d ##class(PHA.TEST.Function).PIECE13()
ClassMethod PIECE13()
{
SET colorlist="Red,Blue,Yellow,Green,Orange,Black"
WRITE !,colorlist
SET $PIECE(colorlist,",",4,6)="Yellow+Blue,Yellow+Red"
WRITE !,colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE13()
Red,Blue,Yellow,Green,Orange,Black
Red,Blue,Yellow,Yellow+Blue,Yellow+Red
可以通過分隔的子字符串計數(使用n)或從字符串末尾的偏移量(使用* + n
)追加一個或多個分隔的子字符串。 SET $PIECE
根據需要附加其他定界符,以在指定位置附加定界的子字符串。以下示例都將colorlist
的值更改爲“Green^Blue^^Red”
,並使用額外的空字符串分隔子字符串進行填充:
/// d ##class(PHA.TEST.Function).PIECE14()
ClassMethod PIECE14()
{
SET colorlist="Green^Blue"
SET $PIECE(colorlist,"^",4)="Red"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE14()
Green^Blue^^Red
/// d ##class(PHA.TEST.Function).PIECE15()
ClassMethod PIECE15()
{
SET colorlist="Green^Blue"
SET $PIECE(colorlist,"^",*+2)="Red"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE15()
Green^Blue^^Red
如果定界符未出現在字符串中,則$PIECE
會將字符串視爲單個片段,並執行與上述相同的替換。如果未指定from參數,則新值將替換原始字符串:
/// d ##class(PHA.TEST.Function).PIECE16()
ClassMethod PIECE16()
{
SET colorlist="Red,Green,Blue"
WRITE colorlist,!
SET $PIECE(colorlist,"^")="Purple^Orange"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE16()
Red,Green,Blue
Purple^Orange
如果定界符未出現在字符串中,並且from被指定爲大於1的整數,則$PIECE
將from-1定界符和提供的值附加到字符串的末尾:
/// d ##class(PHA.TEST.Function).PIECE17()
ClassMethod PIECE17()
{
SET colorlist="Red,Green,Blue"
WRITE colorlist,!
SET $PIECE(colorlist,"^",3)="Purple"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE17()
Red,Green,Blue
Red,Green,Blue^^Purple
如果from表示字符串開頭之前的位置,則Caché不執行任何操作:
/// d ##class(PHA.TEST.Function).PIECE18()
ClassMethod PIECE18()
{
SET colorlist="Red,Green,Blue"
WRITE colorlist,!
SET $PIECE(colorlist,",",*-7)="Purple"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE18()
Red,Green,Blue
Red,Green,Blue
如果from表示字符串開頭之前的位置並提供to,則Caché將from視爲位置1:
/// d ##class(PHA.TEST.Function).PIECE19()
ClassMethod PIECE19()
{
SET colorlist="Red,Green,Blue"
WRITE colorlist,!
SET $PIECE(colorlist,",",*-7,1)="Purple"
WRITE colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE19()
Red,Green,Blue
Purple,Green,Blue
初始化字符串變量
在爲字符串變量賦值之前,不需要定義它。下面的示例將newvar
初始化爲字符模式“ >>>>>> TOTAL”
:
DHC-APP>SET $PIECE(newvar,">",7)="TOTAL"
DHC-APP>WRITE newvar
>>>>>>TOTAL
分隔符爲空字符串
如果定界符爲空字符串,則無論from和to參數的值如何,新值都會替換原始字符串。
以下兩個示例都將顏色列表設置爲“Purple”
:
/// d ##class(PHA.TEST.Function).PIECE20()
ClassMethod PIECE20()
{
SET colorlist="Red,Green,Blue"
WRITE !,colorlist
SET $PIECE(colorlist,"")="Purple"
WRITE !,colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE20()
Red,Green,Blue
Purple
/// d ##class(PHA.TEST.Function).PIECE21()
ClassMethod PIECE21()
{
SET colorlist="Red,Blue,Yellow,Green,Orange,Black"
WRITE !,colorlist
SET $PIECE(colorlist,"",3,5)="Purple"
WRITE !,colorlist
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE21()
Red,Blue,Yellow,Green,Orange,Black
Purple
參數超過32,768個字符的$PIECE
下面的示例創建一個由5個句點和一個null組成的字符串:
/// d ##class(PHA.TEST.Function).PIECE22()
ClassMethod PIECE22()
{
SET x=""
SET $PIECE(x,".",6)=""
WRITE x
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE22()
.....
現在考慮下面的示例,該示例創建一個32767的字符串和一個null:
SET x=""
SET $PIECE(x,".",32768)=""
儘管從技術上講,它在字符串的最大長度之內,但是如果未啓用長字符串,則此示例將生成MAXSTRING>
錯誤。默認情況下,長字符串在系統範圍內啓用。如果希望將$PIECE
與大於32,767個字符的參數一起使用,則可以使用Config.Miscellaneous
類的EnableLongStrings
屬性檢查或設置系統範圍的長字符串設置。
注意
使用$PIECE
解包數據值
$PIECE
通常用於“解包”包含由分隔符分隔的多個字段的數據值。典型的分隔符包括斜槓(/
),逗號(,
),空格()和分號(
;
)。以下樣本值是與$PIECE一起使用的良好候選者:
"John Jones/29 River St./Boston MA, 02095"
"Mumps;Measles;Chicken Pox;Diptheria"
"45.23,52.76,89.05,48.27"
LENGTH
$LENGTH
的兩個參數形式基於定界符返回字符串中子字符串的數量。使用$LENGTH
確定字符串中子字符串的數量,然後使用$PIECE
提取單個子字符串,如以下示例所示:
/// d ##class(PHA.TEST.Function).PIECE24()
ClassMethod PIECE24()
{
SET sentence="The quick brown fox jumped over the lazy dog's back."
SET delim=" "
SET countdown=$LENGTH(sentence,delim)
SET countup=1
FOR reps=countdown:-1:1 {
SET extract=$PIECE(sentence,delim,countup)
WRITE !,countup," ",extract
SET countup=countup+1
}
WRITE !,"All done!"
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE24()
1 The
2 quick
3 brown
4 fox
5 jumped
6 over
7 the
8 lazy
9 dog's
10 back.
All done!
Null Values
$PIECE
不會區分帶有空字符串值的帶分隔符的子字符串和不存在的子字符串。兩者都返回一個空字符串值。例如,下面的示例均返回from值7的空字符串:
/// d ##class(PHA.TEST.Function).PIECE25()
ClassMethod PIECE25()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
SET extract1=$PIECE(colorlist,",",6)
SET extract2=$PIECE(colorlist,",",7)
WRITE "6=",extract1,!,"7=",extract2
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE25()
6=Black
7=
/// d ##class(PHA.TEST.Function).PIECE26()
ClassMethod PIECE26()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black,"
SET extract1=$PIECE(colorlist,",",6)
SET extract2=$PIECE(colorlist,",",7)
WRITE "6=",extract1,!,"7=",extract2
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE26()
6=Black
7=
在第一種情況下,沒有第七個子字符串;返回一個空字符串。在第二種情況下,有第七個子字符串,如字符串末尾的定界符所指示;該第七個子字符串的值是空字符串。
下面的示例顯示字符串中的空值。它提取子字符串1和3。這些子字符串存在,但都包含一個空字符串。 (子字符串1定義爲第一個定界符之前的字符串):
/// d ##class(PHA.TEST.Function).PIECE27()
ClassMethod PIECE27()
{
SET colorlist=",Red,,Blue,"
SET extract1=$PIECE(colorlist,",")
SET extract3=$PIECE(colorlist,",",3)
WRITE !,"sub1=",extract1,!,"sub3=",extract3
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE27()
sub1=
sub3=
以下示例還返回一個空字符串,因爲指定的子字符串不存在:
/// d ##class(PHA.TEST.Function).PIECE28()
ClassMethod PIECE28()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
SET extract=$PIECE(colorlist,",",0)
WRITE !,"Length=",$LENGTH(extract),!,"Value=",extract
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE28()
Length=0
Value=
/// d ##class(PHA.TEST.Function).PIECE29()
ClassMethod PIECE29()
{
SET colorlist="Red,Green,Blue,Yellow,Orange,Black"
SET extract=$PIECE(colorlist,",",8,20)
WRITE !,"Length=",$LENGTH(extract),!,"Value=",extract
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE29()
Length=0
Value=
強制數值計算
在$PIECE
(或任何ObjectScript函數)前加一元+
號可強制對返回值進行數值計算。它以規範形式返回數字子字符串。它返回一個非數字子字符串爲0。它返回一個混合數字子字符串的前導數字部分。對於空字符串值或不存在的子字符串,它將返回0。
/// d ##class(PHA.TEST.Function).PIECE30()
ClassMethod PIECE30()
{
SET str="snow white,7dwarves,+007.00,99.90,,-0,"
WRITE "Substrings:",!
FOR i=1:1:7 {WRITE i,"=",$PIECE(str,",",i)," "}
WRITE !,"Forced Numerics:",!
FOR i=1:1:7 {WRITE i,"=",+$PIECE(str,",",i)," "}
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE30()
Substrings:
1=snow white 2=7dwarves 3=+007.00 4=99.90 5= 6=-0 7=
Forced Numerics:
1=0 2=7 3=7 4=99.9 5=0 6=0 7=0
嵌套$PIECE操作
要執行復雜的提取,可以將 $PIECE
引用彼此嵌套。內部$PIECE
返回一個由外部$PIECE
操作的子字符串。每個$PIECE
使用其自己的定界符。例如,以下返回狀態縮寫“MA”
:
/// d ##class(PHA.TEST.Function).PIECE31()
ClassMethod PIECE31()
{
SET patient="John Jones/29 River St./Boston MA 02095"
SET patientstateaddress=$PIECE($PIECE(patient,"/",3)," ",2)
WRITE patientstateaddress
}
DHC-APP>d ##class(PHA.TEST.Function).PIECE31()
MA
以下是使用定界符層次結構嵌套PIECE使用脫字符號(
^)分隔符查找第二個嵌套列表:
“A,B,C”。然後,外部
$PIECE使用逗號(
,)分隔符返回子字符串
“A,B,C”的第一部分和第二部分(
“A,B”`):
/// d ##class(PHA.TEST.Function).PIECE32()
ClassMethod PIECE32()
{
SET nestlist="1,2,3^A,B,C^@#!"
WRITE $PIECE($PIECE(nestlist,"^",2),",",1,2)
}
DHC-APP> d ##class(PHA.TEST.Function).PIECE32()
A,B
EXTRACT和$LIST的比較
$PIECE
通過計算字符串中用戶定義的定界符來確定子字符串。 $PIECE
將包含要用作定界符的一個或多個字符實例的普通字符串作爲輸入。
$EXTRACT
通過從字符串開頭計數字符來確定子字符串。 $EXTRACT
將普通字符串作爲輸入。
$LIST
通過從列表的開頭計數元素(而非字符)來確定編碼列表中的元素。 $LIST
函數無需使用指定的分隔符即可指定子字符串。如果預留定界符或字符序列不適合數據類型(例如,位串數據),則應使用$LISTBUILD
和$LIST
函數存儲和檢索子串。可以使用$LISTFROMSTRING
函數將定界字符串轉換爲列表。可以使用$LISTTOSTRING
函數將列表轉換爲定界字符串。
$PIECE
和$LIST
函數使用的數據存儲策略不兼容,因此不應將其結合使用。例如,嘗試在使用$LISTBUILD
創建的列表上使用$PIECE
會產生不可預測的結果,應避免使用。