第四十九章 Caché 函數大全 $PIECE 函數

2020-10-11 13:00:16

第四十九章 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返回一個空字串。

$PIECE將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"

$PIECE 與 $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操作的另一個範例。首先,內部$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

$PIECE$EXTRACT$LIST的比較

$PIECE通過計算字串中使用者定義的定界符來確定子字串。 $PIECE將包含要用作定界符的一個或多個字元範例的普通字串作為輸入。

$EXTRACT通過從字串開頭計數位符來確定子字串。 $EXTRACT將普通字串作為輸入。

$LIST通過從列表的開頭計數元素(而非字元)來確定編碼列表中的元素。 $LIST函數無需使用指定的分隔符即可指定子字串。如果預留定界符或字元序列不適合資料型別(例如,位串資料),則應使用$LISTBUILD$LIST函數儲存和檢索子串。可以使用$LISTFROMSTRING函數將定界字串轉換為列表。可以使用$LISTTOSTRING函數將列表轉換為定界字串。

$PIECE$LIST函數使用的資料儲存策略不相容,因此不應將其結合使用。例如,嘗試在使用$LISTBUILD建立的列表上使用$PIECE會產生不可預測的結果,應避免使用。