第111章 Caché 函式大全 $ZNAME 函式

yaoxin521123發表於2020-12-10

文章目錄

第111章 Caché 函式大全 $ZNAME 函式

驗證指定的名稱字串是否為合法識別符號。

大綱

$ZNAME(string,type,lang)

引數

  • string 要計算的名稱,指定為帶引號的字串。
  • 可選-指定要執行的名稱驗證型別的整數程式碼。有效值為0到6。預設值為0。
  • 可選-指定驗證字串時使用的語言模式的整數程式碼。有效值為0到12。預設情況下使用當前語言模式。

描述

如果字串引數是合法的識別符號,則$ZNAME返回1(TRUE)。否則,$ZNAME返回0(False)。可選的type引數確定要對字串執行哪種型別的名稱驗證。如果省略此引數,則驗證預設為區域性變數命名約定。可選的lang引數指定要應用於驗證的語言模式約定。

區域設定可能不允許使用$ZNAME驗證為合法識別符號的識別符號。區域設定的有效識別符號字元在國家語言支援(NLS)識別符號區域設定中定義;它們不能由使用者修改。

$ZNAME僅執行字元驗證;它不執行識別符號的字串長度驗證。

引數

string

要驗證為合法識別符號名的帶引號的字串。有效字串可以包含的字元取決於要驗證的識別符號的型別(由type指定)、語言模式(Lang)和區域設定的定義。該字串僅指定識別符號名;它不應包括字首字元,例如插入符號(^)字首和全域性名稱空間名稱字首(可選分隔),或字尾字元(例如陣列下標或引數圓括號)。預設情況下,以下是Caché中的有效識別符號字元:

  • 大寫字母:A到Z($CHAR(65)$CHAR(90))
  • 小寫字母:a到z($Char(97)$Char(122))
  • 帶重音符號的字母:($CHAR(192)$CHAR(255),不包括$CHAR(215)$CHAR(247))
  • Unicode安裝:非拉丁字符集的Unicode字母,如希臘或西裡爾字母。例如,$CHAR(256)$CHAR(687)$CHAR(913)$CHAR(1153),不包括$CHAR(930)$CHAR(1014)
  • 數字:0到9($CHAR(48)$CHAR(57)),受某些識別符號的位置限制
  • 百分號:%($CHAR(37))受某些識別符號的位置限制

$ZNAME還接受$CHAR(170)$CHAR(181)$CHAR(186)作為有效字元。

注意:日語區域設定不支援識別符號中的重音拉丁字母字元。日文識別符號除包含日文字元外,還可以包含拉丁字母字元A-Z和a-z(65-90和97-122)以及希臘大寫字母字元(913-929和931-937)。

type

指定要執行的名稱驗證型別的整數程式碼:

程式碼含義限制字元
0驗證區域性變數名。僅第一個字元:%,後續字元:數字0–9
1驗證例程routine名稱。僅第一個字元:%,僅後續字元:數字0–9和句點()字元。句點不能是例程名稱中的第一個或最後一個字元。
2驗證標籤label(標記tag)名稱。僅第一個字元:%
3應用於全域性或程式專用全域性名稱。僅第一個字元:%,僅後續字元:數字0–9和句點()字元。句點不能是全域性名稱中的第一個或最後一個字元。
4驗證完全限定的類名。僅第一個字元:%,僅後續字元:數字0–9和句點()字元。句點不能是例程名稱中的第一個或最後一個字元。
5驗證方法名稱。僅第一個字元:%,後續字元:數字0–9
6驗證屬性名稱僅第一個字元:%,後續字元:數字0–9

如果type = 0(或未指定),則可以將通過驗證的識別符號用作區域性變數名稱或任何其他型別的ObjectScript名稱。這是驗證的最嚴格形式。有效識別符號的第一個字元必須是百分號()或有效字母字元。有效識別符號的第二個和後續字元必須是有效字母字元或數字。

如果type = 2,則可以將通過驗證的識別符號用作行標籤。這是唯一一種允許數字(0–9)作為第一個字元的識別符號。僅指定標籤名稱;不要在標籤名稱後指定冒號字首(用於觸發器)或引數括號。

如果type = 3,則可以將通過驗證的識別符號用於全域性名和程式專用全域性名。但是,全域性名稱和程式專用的全域性名稱不能包含寬字元。 $ZNAME認為寬字元字母是所有名稱驗證型別的有效識別符號字元。因此,如果type = 3,則包含寬字元字母的識別符號將通過$ZNAME驗證,但在用作全域性名稱或程式專用全域性名稱時會生成<WIDE CHAR>錯誤。

如果type = 4,則可以將通過驗證的識別符號用作類名。類名可以包含句點,但有以下限制:句點後不能緊跟數字字元或其他句點。這些使用期限的限制不適用於type = 1type = 3驗證。任何型別的有效識別符號都不能以句點作為字串的第一個或最後一個字元。

lang

一個整數程式碼,指定用於驗證的語言模式。 Caché將指定語言模式的約定應用於驗證,而無需更改當前語言模式。 (有關可用的當前語言模式的列表,請參見%SYSTEM.Process類的LanguageMode()方法。)預設情況下,$ZNAME使用當前語言模式的語言模式約定。因為所有Caché語言模式都使用相同的命名約定,所以可以省略lang並採用預設值,除非指定lang = 11。

示例

以下示例顯示了$ZNAME函式,該函式將表示式驗證為true(1)。請注意,最後兩個示例包含句點,例程名稱(型別= 1)和全域性名稱(型別= 3)允許使用句點:

/// d ##class(PHA.TEST.Function).ZNAME()
ClassMethod ZNAME()
{
	WRITE !,$ZNAME("A")
	WRITE !,$ZNAME("A1")
	WRITE !,$ZNAME("%A1",0)
	WRITE !,$ZNAME("%A1",1)
	WRITE !,$ZNAME("A.1",1)
	WRITE !,$ZNAME("A.1",3)
}

在下面的示例中,第一個$ZNAME驗證失敗(返回0),因為(預設情況下)它會驗證本地變數名,並且本地變數名的第一個字元不能為數字。第二個$ZNAME通過驗證(返回1),因為type = 2指定標籤驗證,並且標籤名稱的第一個字元可以是數字。

/// d ##class(PHA.TEST.Function).ZNAME1()
ClassMethod ZNAME1()
{
	WRITE "local var: ",$ZNAME("1A"),!
	WRITE "label: ",$ZNAME("1A",2)
}
DHC-APP>d ##class(PHA.TEST.Function).ZNAME1()
local var: 0
label: 1

以下示例使所有型別值的驗證失敗。所有型別的Caché名稱都不能包含百分號,除非它是名稱的第一個字元:

/// d ##class(PHA.TEST.Function).ZNAME2()
ClassMethod ZNAME2()
{
	FOR i=0:1:6 {
		WRITE "type ",i," is ",$ZNAME("A%1",i),!
	}
}
DHC-APP>d ##class(PHA.TEST.Function).ZNAME2()
type 0 is 0
type 1 is 0
type 2 is 0
type 3 is 0
type 4 is 0
type 5 is 0
type 6 is 0

以下示例顯示了本地變數名稱的完整有效8位識別符號字符集。這些有效的識別符號字元包括字母字元ASCII 192至ASCII 255,但ASCII 215和ASCII 247除外,它們是算術符號:

/// d ##class(PHA.TEST.Function).ZNAME3()
ClassMethod ZNAME3()
{
	FOR n=1:1:255  {
		IF $ZNAME("A"_$CHAR(n),0) & $ZNAME($CHAR(n),0){
			WRITE !,$ZNAME($CHAR(n))," ASCII code=",n," Char.=",$CHAR(n) 
		} ELSEIF $ZNAME($CHAR(n),0){
			WRITE !,$ZNAME($CHAR(n))," ASCII code=",n," 1st Char.=",$CHAR(n) 
		} ELSEIF $ZNAME("A"_$CHAR(n),0){
			WRITE !,$ZNAME("A"_$CHAR(n))," ASCII code=",n," Subseq. Char.=",$CHAR(n) 
		} ELSE { 
		}
	}
	WRITE !,"All done"
}

DHC-APP>d ##class(PHA.TEST.Function).ZNAME3()
 
1 ASCII code=37 1st Char.=%
1 ASCII code=48 Subseq. Char.=0
1 ASCII code=49 Subseq. Char.=1
1 ASCII code=50 Subseq. Char.=2
1 ASCII code=51 Subseq. Char.=3
1 ASCII code=52 Subseq. Char.=4
1 ASCII code=53 Subseq. Char.=5
1 ASCII code=54 Subseq. Char.=6
1 ASCII code=55 Subseq. Char.=7
1 ASCII code=56 Subseq. Char.=8
1 ASCII code=57 Subseq. Char.=9
1 ASCII code=65 Char.=A
1 ASCII code=66 Char.=B
1 ASCII code=67 Char.=C
1 ASCII code=68 Char.=D
1 ASCII code=69 Char.=E
1 ASCII code=70 Char.=F
1 ASCII code=71 Char.=G
1 ASCII code=72 Char.=H
1 ASCII code=73 Char.=I
1 ASCII code=74 Char.=J
1 ASCII code=75 Char.=K
1 ASCII code=76 Char.=L
1 ASCII code=77 Char.=M
1 ASCII code=78 Char.=N
1 ASCII code=79 Char.=O
1 ASCII code=80 Char.=P
1 ASCII code=81 Char.=Q
...

以下示例通過了Caché的Unicode安裝的驗證。指定的希臘字母是有效的Unicode字母,因此可以通過$ZNAME驗證。但是,此名稱不能用於全域性或程式專用的全域性(型別= 3),並且可能無法在某些語言環境(例如日語語言環境)中使用:

/// d ##class(PHA.TEST.Function).ZNAME4()
ClassMethod ZNAME4()
{
	IF $SYSTEM.Version.IsUnicode() {
		WRITE $C(913)_$C(961)_$C(947)_$C(959),!
		FOR i=0:1:6 {
			WRITE "type ",i," is ",$ZNAME($C(913)_$C(961)_$C(947)_$C(959),i),!
		}
	}
	ELSE {
		WRITE "此示例需要安裝Unicode的Caché"
	}
}
DHC-APP>d ##class(PHA.TEST.Function).ZNAME4()
Αργο
type 0 is 0
type 1 is 0
type 2 is 0
type 3 is 0
type 4 is 0
type 5 is 0
type 6 is 0

SQL識別符號

SQL識別符號可包括標點符號(下劃線(_)、at符號(@)、井號(#)和美元符號($)),這些字元在ObjectScript識別符號中不是有效字元。SQL例程名稱不能在除第一個字元以外的任何位置包含百分號(%)。

相關文章