1. 程式人生 > 實用技巧 >第三十二章 ZPRINT 函式大全 PRINT函式

第三十二章 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返回的註釋,它必須出現在自己的行上,或與標籤在同一行上。它不能出現在包含命令的行或宣告函式或子例程的行上。

可以使用PRINTZPRINT命令顯示當前載入的例程中的一行程式碼(或多行)。 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))