主頁 > 後端開發 > 第四十九章 Caché 函式大全 $PIECE 函式

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

2020-10-12 04:58:23 後端開發

文章目錄

  • 第四十九章 Caché 函式大全 $PIECE 函式
  • 大綱
    • 引數
  • 描述
    • 回傳一個子字串,
  • 引數
    • string
    • delimiter
    • from
    • to
    • 指定`* -n`和`* + n`引數值
    • 示例:回傳帶分隔符的子字串
  • 使用SET $PIECE替換子字串
    • 示例:替換分隔的子字串
    • 初始化字串變數
    • 分隔符為空字串
    • 引數超過32,768個字符的$PIECE
  • 注意
    • 使用`$PIECE`解包資料值
    • $PIECE 與 $LENGTH
    • Null Values
    • 強制數值計算
    • 嵌套$PIECE操作
    • `$PIECE`與`$EXTRACT`和`$LIST`的比較

第四十九章 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會產生不可預測的結果,應避免使用,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168510.html

標籤:java

上一篇:mysql資料庫主從同步中斷的各種情況

下一篇:mysql 計算時間函式差

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more