第三十二章 ZPRINT 函式大全 PRINT函式
返回在指定位置找到的一行原始碼。
大綱
$TEXT(label+offset^routine)
$T(label+offset^routine)
$TEXT(@expr_atom)
$T(@expr_atom)
引數
- label 可選-例程中的行標籤。必須是文字值;變數不能用於指定標籤。線標籤區分大小寫。如果省略,則從例程開始算起+ offset。
- +offset 可選-解析為正整數的表示式,該整數將要返回的行標識為偏移的行數。如果省略,則返回由label標識的行。
- ^routine 可選-例程的名稱。必須是文字值;變數不能用於指定例程。 (請注意,
^
字元是分隔符,不是例程名稱的一部分。)如果例程不在當前名稱空間中,則可以使用擴充套件例程引用來指定包含該例程的名稱空間,如下所示:^ |“名稱空間” |例程
- @expr_atom 一個使用間接提供位置的表達原子。解析為某種形式的
label + offset ^ routine
。
描述
$TEXT
返回在指定位置找到的程式碼行。如果$TEXT
在指定位置找不到原始碼,它將返回空字串。
要標識一行原始碼,必須指定標籤,+偏移量或兩者。預設情況下,$TEXT
訪問當前載入的例程。 $TEXT
是在當前執行的例程中編碼的,還是將當前載入的例程作為最近使用ZLOAD
載入的靜態例程來訪問。可以使用^routine
指定當前載入的例程以外的例程位置。可以使用間接(@expr_atom
)指定位置。
$TEXT
從例程的INT程式碼版本返回指定的行。 INT程式碼不計算或不包含預處理程式語句。 INT程式碼包含所有標籤和大多數註釋,但是無論是在原始碼中還是在多行註釋中,INT程式碼都不包括或不包含例程的MAC版本中的完全空白行。
+ offset
引數使用例程的INT程式碼版本對行進行計數。修改例程後,必須重新編譯$TEXT
例程才能正確計算與INT版本相對應的行和行偏移量。
在返回的原始碼中,如果該行中的第一個空格字元是一個製表符,則$TEXT
將其替換為一個空格字元。所有其他製表符和空格字元將保持不變。因此,$PIECE($TEXT(line)," ",1)
始終返回標籤,而$PIECE($TEXT(line)," ",2,*)
返回除標籤之外的所有程式碼。
當例程僅作為目的碼分發時,;; comment
是物件程式碼中保留的唯一註釋型別。因此只有;;
這些例程中的$TEXT
註釋可用。為一個 ;;
要由$TEXT
返回的註釋,它必須出現在自己的行上,或與標籤在同一行上。它不能出現在包含命令的行或宣告函式或子例程的行上。
可以使用PRINT
或ZPRINT
命令顯示當前載入的例程中的一行程式碼(或多行)。 ZPRINT
(或PRINT
)將編輯指標設定為其列印的行的末尾。 $TEXT
不會更改編輯指標。
引數
label
當前例程中的標籤,或者,如果還提供了例程引數,則為指定例程中的標籤。必須指定為文字,不帶引號。標籤名稱區分大小寫,並且可能包含Unicode字元。標籤的長度可能超過31個字元,但在前31個字元內必須唯一。 $TEXT
僅匹配指定label的前31個字元。
如果省略偏移選項,或指定label + 0
,則Caché將列印標籤行。 label + 1
在標籤之後列印行。如果在例程中未找到label
,則$TEXT
返回空字串。
offset
一個正整數,指定行數,或者作為一個計算結果為正整數的表示式。前導加號(+
)是強制性的。如果單獨指定,則+ offset
指定從例程開始的行數,而+1是例程的第一行。如果使用label
引數指定,則從標籤位置計算行數,其中+0是標籤行本身,而+1是標籤後的行。如果+ offset
大於例程中的行數(或從標號到例程末尾的行數),則$TEXT
返回空字串。
可以指定+0的偏移量。指定標籤時,$TEXT(mylabel + 0)
與$TEXT(mylabel)
相同。如果呼叫$TEXT(+0)
,它將返回當前載入的例程的名稱。
Caché將+offset
解析為規範的正整數。負整數偏移值會產生錯誤。
請注意,Caché將數字和數字字串解析為規範形式,這涉及刪除前導加號(+)。因此,必須在$TEXT
函式中指定加號以將其用作偏移量。
要將變數用作偏移量,必須在其前面加上加號,如以下示例所示:
SET x=7
WRITE $TEXT(x) /* because there is no plus sign, search for a label named x */
WRITE $TEXT(+x) /* locates the offset +7 code line */
routine
如果單獨指定,則表示例程中的第一行程式碼。如果僅使用label引數指定,則返回在例程中該指定標籤上找到的行。如果僅使用offset引數指定,則返回例程中指定偏移量的行。如果同時提供了標籤和偏移量,則返回在例程中指定標籤內的指定偏移量處找到的行。
例程引數必須指定為文字,不帶引號。不能使用變數來指定例程名稱。前導尖號(^
)是強制性的。
預設情況下,Caché在當前名稱空間中搜索例程。如果所需的例程位於另一個名稱空間中,則可以使用擴充套件的全域性引用來指定該名稱空間。例如,$TEXT(mylabel+2^|"SAMPLES"|myroutine)
。請注意,此處只能使用豎線。不能使用方括號。可以將^routine
的名稱空間部分指定為變數。
如果指定的例程或名稱空間不存在,或者使用者沒有該名稱空間的訪問許可權,則$TEXT
返回空字串。
expression atom (@expr_atom)
間接引數,其結果為$TEXT
引數(label+offset^routine
)。
示例
以下四個示例演示了僅使用目的碼儲存的例程。前兩個示例返回引用的行,包括;;
,註釋。第三個和第四個示例返回空字串:
Start1 ;; this comment is on a label line
WRITE $TEXT(Start1)
DHC-APP>d Start1^PHA.TEST.Command
Start1 ;; this comment is on a label line
Start2
;; this comment is on its own line
WRITE $TEXT(Start2+1)
DHC-APP>d Start2^PHA.TEST.Command
;; this comment is on its own line
Start3
SET x="fred" ;; this comment is on a command line
WRITE $TEXT(Start3+1)
DHC-APP>d Start3^PHA.TEST.Command
SET x="fred" ;; this comment is on a command line
MyFunc() ;; this comment is on a function declaration line
WRITE $TEXT(MyFunc)
DHC-APP>d MyFunc^PHA.TEST.Command
MyFunc() ;; this comment is on a function declaration line
以下示例顯示,只有label的前31個字元與指定標籤匹配:
StartabcdefghijklmnopqrstuvwxyzA ;; 32-character label
WRITE $TEXT(StartabcdefghijklmnopqrstuvwxyzB)
DHC-APP>d StartabcdefghijklmnopqrstuvwxyzA^PHA.TEST.Command
StartabcdefghijklmnopqrstuvwxyzA ;; 32-character label
下面的示例顯示了$TEXT(label)
表單,該表單返回在當前例程中指定標籤處找到的行。標籤也會返回。如果使用者輸入“?”
,則會寫出Info
文字以及行標籤,然後控制元件返回到初始提示:
Start4
READ !,"Array name or ? for Info: ",ary QUIT:ary=""
IF ary="?" {
WRITE !,$TEXT(Info),!
GOTO Start
} ELSE {
DO ArrayOutput(ary)
}
QUIT
Info ;; This routine outputs the first-level subscripts of a variable.
QUIT
ArrayOutput(val)
SET i=1
WHILE $DATA(@val@(i)) {
WRITE !,"subscript ",i," is ",@val@(i)
SET i=i+1
}
QUIT
DHC-APP>d Start4^PHA.TEST.Command
Array name or ? for Info: ^yx
subscript 1 is ADMDATE()2015-03-01()2015-03-03()34!SessionGRP!1^23!gbFlag!0^6!DocSpc!^6!CarPrvTp!^-1()4!0!0^5!1!0^6!0!0()()1^3^4()
subscript 2 is ORDDATE$SelectPara!2015-08-23#2015-08-23$ColPara!Null#Null#Null$RowPara!ResDep#AdmType#ALL!AdmType#AdmType#ALL$StatPara!13#數量!14#總費用!15#記帳 費用!16#折扣費用!17#自付費用!26#醫囑數量!31#進貨價!67#條碼數!68#手術數量!69#藥品 售價!81#日期進貨價~~!1~~~~~~~~
DHC-APP>
下面的示例顯示了$TEXT(label+offset)
表單,該表單返回在指定標籤內的偏移量處找到的行,該行必須在當前例程內。如果偏移量為0,則返回帶有標籤的標籤行。本示例使用FOR
迴圈訪問多行文字,避免顯示標籤或多行註釋定界符:
Start4
READ !,"Array name or ? for Info: ",ary QUIT:ary=""
IF ary="?" {
DO Info
GOTO Start
} ELSE {
DO ArrayOutput(ary)
}
QUIT
Info
FOR loop=2:1:6 {
WRITE !,$TEXT(Info+loop)
}
/*
該例程輸出變數的第一級下標。具體來說,它要求提供變數的名稱,然後為包含資料的每個下標節點寫出當前值。當遇到不包含資料的節點時,它將停止。
*/
QUIT
ArrayOutput(val)
SET i=1
WHILE $DATA(@val@(i)) {
WRITE !,"subscript ",i," is ",@val@(i)
SET i=i+1
}
QUIT
DHC-APP>d Start4^PHA.TEST.Command
Array name or ? for Info: ^yx
subscript 1 is ADMDATE()2015-03-01()2015-03-03()34!SessionGRP!1^23!gbFlag!0^6!DocSpc!^6!CarPrvTp!^-1()4!0!0^5!1!0^6!0!0()()1^3^4()
subscript 2 is ORDDATE$SelectPara!2015-08-23#2015-08-23$ColPara!Null#Null#Null$RowPara!ResDep#AdmType#ALL!AdmType#AdmType#ALL$StatPara!13#數量!14#總費用!15#記帳 費用!16#折扣費用!17#自付費用!26#醫囑數量!31#進貨價!67#條碼數!68#手術數量!69#藥品 售價!81#日期進貨價~~!1~~~~~~~~
以下示例使用擴充套件例程引用從SAMPLES
名稱空間中的例程訪問一行程式碼。它訪問名為myroutine
的例程中ErrorTest
標籤之後的第一行程式碼。可以從任何名稱空間執行:
WRITE $TEXT(ErrorTest+1^|"SAMPLES"|myroutine)
注意
引數間接
整個$TEXT
引數的間接呼叫是對行和例程進行間接引用的便捷方法。例如,如果變數ENTRYREF
同時包含行標籤和例程名稱,則可以引用該變數:
$TEXT(@ENTRYREF)
而不是分別引用該行和例程:
$TEXT(@$PIECE(ENTRYREF,"^",1)^@$PIECE(ENTRYREF,"^",2))