文章目录

  • 第三十二章 Caché 命令大全 WRITE 命令
  • 重点
  • 大纲
    • 参数
  • 描述
    • 无参数WRITE
    • 有参数`WRITE`
  • 参数
    • pc
    • expression
    • f
    • *integer
    • *整数和$ X,$ Y
    • `*-integer`
    • 输入缓冲区控制
    • 输出缓冲器控制
  • 示例
  • 注意
    • `WRITE $ X`和`$ Y`
    • 在`WRITE`中使用格式控件
      • `!`格式控制字符
      • `#`格式控制字符
      • `?n`格式控制字符
      • `/助记符`格式控制字符
    • 指定格式控件序列
    • 带`WRITE`的转义序列
    • WRITE与其他WRITE命令的比较

 

 
第三十二章 Caché 命令大全 WRITE 命令

显示输出到当前设备。

重点
  1. 无参数WRITE列出所有定义的局部变量的名称和值。它没有列出进程私有全局变量、全局变量或特殊变量。它按以下格式列出定义的局部变量,每行一个变量
  2. WRITE *7 播放声音
  3. $X,$Y在terminal里显示的位置
大纲
WRITE:pc writeargument,...
W:pc writeargument,...

其中writeargument可以是:

expression
f
*integer
*-integer

参数

  • pc 可选 - 后置表达式
  • expression 可选-写入输出设备的值。任何有效的ObjectScript表达式,包括文字,变量,对象方法和对象属性,其结果均为数字或带引号的字符串。
  • f 可选-一个或多个格式控制字符,用于将输出放置在目标设备上。格式控制字符包括!,#、?和/。
  • *integer 可选-整数代码,表示要写入输出设备的字符。对于ASCII,范围是0到255之间的整数;对于Unicode,范围是0到65534之间的整数。任何有效的ObjectScript表达式,其计算结果为适当范围内的整数。星号是强制性的。
  • *-integer 可选—指定设备控制操作的负整数代码。星号是强制性的。
描述

WRITE命令显示当前I/O设备上的指定输出。(要设置当前I/O设备,请使用USE命令,该命令设置$IO特殊变量的值。)。写入有两种形式:

  • WRITE无参
  • WRITE有参

无参数WRITE

无参数WRITE列出所有定义的局部变量的名称和值。它没有列出进程私有全局变量、全局变量或特殊变量。它按以下格式列出定义的局部变量,每行一个变量:

varname1=value1
varname2=value2

无参数写入将所有类型的局部变量值显示为带引号的字符串。规范数字和对象引用除外。显示标准数字时不带引号。对象引用(OREF)显示如下:myoref=<OBJECT REFERENCE>[1@%SQL.Statement]; JSON数组或JSON对象显示为对象引用(OREF)。位字符串值和列表值显示为带引号的字符串,数据值以编码形式显示。

/// d ##class(PHA.TEST.Command).TestWrite()
ClassMethod TestWrite()
{
	SET str="fred"
	SET num=+123.40
	SET canonstr="456.7"
	SET noncanon1="789.0"
	SET noncanon2="+999"
	WRITE
}

DHC-APP>d ##class(PHA.TEST.Command).TestWrite()
 
<Private variables>
str="fred"
num=123.4
canonstr=456.7
noncanon1="789.0"
noncanon2="+999"

无参数WRITE以区分大小写的字符串排序顺序显示局部变量,如以下WRITE输出示例所示:

/// d ##class(PHA.TEST.Command).TestWrite1()
ClassMethod TestWrite1()
{
	SET A="Apple"
	SET B="Banana"
	SET a="apple varieties"
	SET a1="macintosh"
	SET a10="winesap"
	SET a19="northern spy"
	SET a2="golden delicious"
	SET aa="crabapple varieties"
	w
}

DHC-APP>d ##class(PHA.TEST.Command).TestWrite1()
 
<Private variables>
A="Apple"
B="Banana"
a="apple varieties"
a1="macintosh"
a10="winesap"
a19="northern spy"
a2="golden delicious"
aa="crabapple varieties"

无参数WRITE使用数字排序规则以下标树顺序显示局部变量的下标,如以下WRITE输出示例所示:

/// d ##class(PHA.TEST.Command).TestWrite2()
ClassMethod TestWrite2()
{
	SET a(10)="Argentina"
	SET a(2,1)="Maritime Provinces"
	SET a(2)="Canada"
	SET a(1)="United States"
	SET a(1,1)="Northeastern Region"
	SET a(1,1,1)="Maine"
	SET a(1,1,2)="New Hampshire"
	SET a(1,2)="Southeastern Region"
	SET a(1,2,1)="Florida"
	
	w
}
DHC-APP>d ##class(PHA.TEST.Command).TestWrite2()
 
<Private variables>
a(1)="United States"
a(1,1)="Northeastern Region"
a(1,1,1)="Maine"
a(1,1,2)="New Hampshire"
a(1,2)="Southeastern Region"
a(1,2,1)="Florida"
a(2)="Canada"
a(2,1)="Maritime Provinces"
a(10)="Argentina"

无参数WRITE执行控制字符,例如换行Formfeed ($CHAR(12)) 和 退格Backspace ($CHAR(8))。因此,将显示定义控制字符的局部变量,如以下示例所示:

/// d ##class(PHA.TEST.Command).TestWrite3()
ClassMethod TestWrite3()
{
	SET name="fred"
	SET number=123
	SET bell=$CHAR(7)
	SET formfeed=$CHAR(10)
	SET backspace=$CHAR(8)
	WRITE
}
DHC-APP>d ##class(PHA.TEST.Command).TestWrite3()
 
<Private variables>
name="fred"
number=123
bell=""
formfeed="
          "
backspace="

给定一个名为back的局部变量,多个退格显示如下:1个退格:back =“; 2个退格:back”“; 3个退格:bac” =“; 4个退格:ba” k =“; 5个退格:b” ck =“; 6个退格键:” ack =“; 7个或更多退格键:” ack =“。

无参数的WRITE必须与同一行上跟随它的命令之间至少有两个空格隔开。如果其后的命令是带有参数的WRITE,则必须为WRITE提供带有适当行返回f格式控制参数的参数。在下面的示例中显示:

/// d ##class(PHA.TEST.Command).TestWrite4()
ClassMethod TestWrite4()
{
   SET myvar="fred"
   WRITE  WRITE          ; 注意无参数后写两个空格
   WRITE  WRITE myvar    ; 需要格式化
   WRITE  WRITE !,myvar  ; 提供格式
}
DHC-APP>d ##class(PHA.TEST.Command).TestWrite4()
 
<Private variables>
myvar="fred"
<Private variables>
myvar="fred"
<Private variables>
myvar="fred"fred
<Private variables>
myvar="fred"
fred

发出CTRL-C会生成错误,从而中断无参数的WRITE列表。

可以使用无参数WRITE显示所有定义的局部变量。可以使用$ORDER函数返回定义的局部变量的有限子集。

有参数WRITE

WRITE可以采用单个writeargument或以逗号分隔的writearguments列表。 WRITE命令可以采用表达式,f,* integer和* -integer参数的任意组合。

  • WRITE表达式显示与表达式参数相对应的数据值。表达式可以是变量,文字或任何计算结果为文字值的表达式的名称。
  • WRITE f提供任何所需的输出格式。因为WRITE的实参形式不提供用于分隔实参值或指示字符串的自动格式,所以表达式值将显示为单个字符串,除非用f格式分隔。
  • WRITE * integer显示由整数代码表示的字符。
  • WRITE *-整数提供设备控制操作。

WRITE参数用逗号分隔。例如:

   WRITE "numbers",1,2,3
   WRITE "letters","ABC"

显示为:

DHC-APP>WRITE "numbers",1,2,3
numbers123
DHC-APP>WRITE "letters","ABC"
lettersABC

请注意,WRITE不会在其输出字符串的末尾附加行返回。为了分隔WRITE输出,必须显式指定f参数格式字符,例如行返回(!)字符。

   WRITE "numbers ",1,2,3,!
   WRITE "letters ","ABC"

显示为:

DHC-APP>WRITE "numbers ",1,2,3,!
numbers 123
 
DHC-APP>WRITE "letters ","ABC"
letters ABC
参数

pc

可选的后置条件表达式。如果后置条件表达式为true(计算为非零数值),则Caché执行命令。如果后置条件表达式为假(计算为零),则Caché不执行命令。您可以为无参数WRITE或带参数的WRITE指定后置条件表达式。

expression

希望显示的值。最常见的是,它可以是文字(带引号的字符串或数字)或变量。但是,表达式可以是任何有效的ObjectScript表达式,包括文字,变量,算术表达式,对象方法和对象属性。

表达式可以是任何类型的变量,包括局部变量,进程专用全局变量,全局变量和特殊变量。变量可以下标; WRITE仅显示指定的下标节点的值。

数据值(指定为文字还是变量)显示如下:

  • 字符串显示时不包含引号。某些非打印字符不会显示: $CHAR 0, 1, 2, 14, 15, 28, 127其他非打印字符显示为占位符:$ CHAR 3,16–26。执行控制字符:$ CHAR 7–13,27。例如,$ CHAR(8)执行一个退格键,$ CHAR(11)执行一个垂直制表符。
  • 数字以规范形式显示。执行算术运算。
  • 扩展的全局变量引用显示为全局值,而不指示定义全局变量的名称空间。如果指定了不存在的名称空间,则Caché会发出错误。如果指定了没有权限的名称空间,则Caché会发出错误,后跟全局变量名称和数据库路径,例如:<PROTECT> ^myglobal,c:\intersystems\cache\mgr\.
  • Caché List结构化数据以编码形式显示。
  • Caché 位串以编码形式显示。
  • 对象引用显示为OREF值。例如,##class(%SQL.Statement).%New()显示为2@%SQL.Statement。JSON动态对象或JSON动态数组显示为OREF值。
  • 对象方法和属性显示属性的值或方法返回的值。Get方法返回的值是参数的当前值; Set方法返回的值是参数的先前值。可以使用下标指定多维属性;使用下标(或空括号)指定非多维属性会导致<Object Dispatch>错误。
  • %Status显示为1(成功)或复杂的编码失败状态,其第一个字符为0。

f

一种格式控件,用于将输出放置在目标设备上。可以指定格式控制字符的任意组合,而无需插入逗号,但是必须使用逗号将格式控制与表达式分开。例如,当您向终端发出以下WRITE时:

 WRITE #!!!?6,"Hello",!,"world!"

格式控制位置到新屏幕的顶部(#),然后发出三行返回(!!!),然后缩进六列(?6)。然后,WRITE显示字符串Hello,执行格式控制行返回(!),然后显示字符串world!。请注意,行返回重新定位到第1列;因此,在此示例中,“ Hello”显示为缩进,但显示为world!不是。

格式控制字符不能与无参数写入一起使用。

*integer

* integer参数允许使用正整数代码将字符写入当前设备。它包含一个星号,后跟任何有效的ObjectScript表达式,该表达式的计算结果为与字符相对应的正整数。是否要使用正整数代码将字符写入当前设备。* integer参数可以对应于可打印字符或控制字符。介于0到255之间的整数将求值为相应的8位ASCII字符。256到65534之间的整数将得出相应的16位Unicode字符(在Unicode系统上)。
*
如下例所示,* integer可以指定整数代码,或指定可解析为整数代码的表达式。以下示例均返回“Caché”一词:

/// d ##class(PHA.TEST.Command).TestInteger()
ClassMethod TestInteger()
{
	WRITE !,"Cach",*233
	WRITE !,*67,*97,*99,*104,*233
	SET accent=233
	WRITE !,"Cach",*accent    ; 计算变量
	WRITE !,"Cach",*232+1     ; 算术运算被计算
	WRITE !,"Cach",*00233.999 ; 小数被截断为整数
}

DHC-APP>d ##class(PHA.TEST.Command).TestInteger()
 
Caché
Caché
Caché
Caché
Caché

要使用适当的捷克重音符号写作曲家Anton Dvorak的名字,请使用:

/// d ##class(PHA.TEST.Command).TestInteger1()
ClassMethod TestInteger1()
{
	IF $SYSTEM.Version.IsUnicode()  {
	WRITE "Anton Dvo",*345,*225,"k" }
	ELSE {WRITE "本示例需要Caché的Unicode安装"}
}
DHC-APP>d ##class(PHA.TEST.Command).TestInteger1()
Anton Dvo??ák

由表达式计算得出的整数可以对应于控制字符。根据目标设备解释此类字符。* integer参数可用于插入控制显示器外观的控制字符(例如换页符:* 12),或特殊字符(例如* 7)插入终端的铃声。

例如,如果当前设备是终端,则整数0到30将被解释为ASCII控制字符。以下命令将ASCII码7和12发送到终端。

   WRITE *7 ; bell声音
   WRITE *12 ; 换行 (blank line)

这是一个将表达式参数与* integer(指定换页符)结合在一起的示例:

 WRITE "stepping",*12,"down",*12,"the",*12,"stairs"
DHC-APP>  WRITE "stepping",*12,"down",*12,"the",*12,"stairs"
stepping
        down
            the
               stairs

*整数和$ X,$ Y

写入终端时,整数表达式不会更改$ X和$ Y特殊变量。因此,WRITE“ a”和WRITE $ CHAR(97)都增加$ X中包含的列号值,而WRITE * 97则不增加$ X。

可以使用* integer发出退格键(ASCII 8),换行符(ASCII 10)或其他控制字符,而无需更改$ X和$ Y值。以下终端示例演示了整数表达式的用法。

Backspace退格:

DHC-APP>WRITE $X,"/",$CHAR(8),$X
01
DHC-APP>WRITE $X,"/",*8,$X
02

Linefeed换行:

DHC-APP>WRITE $Y,$CHAR(10),$Y
140
   141
DHC-APP>WRITE $Y,*10,$Y
143
   143

*-integer

星号后跟负整数是设备控制代码。 WRITE支持以下常规设备控制代码:

Code 设备操作
*-1 在下一次读取时清除输入缓冲区。
*-2 断开TCP设备或命名管道的连接。
*-3 将输出缓冲区刷新到设备。这将强制写入磁盘上的文件。
*-9 在当前文件指针位置截断顺序文件的内容。为了截断文件,必须打开文件(使用OPEN命令至少具有“ RW”访问权限),并且必须将其建立为当前设备(使用USE命令)。
*-10 立即清除输入缓冲区。
*-99 发送压缩的流数据。

WRITE还支持许多磁带设备的设备控制代码。

输入缓冲区控制

* -1和* -10控件用于从终端设备输入。这些控件清除输入缓冲区中尚未由READ命令接受的任何字符。* -1控件在下一次读取时清除输入缓冲区。* -10控件立即清除输入缓冲区。如果在调用WRITE * -1或WRITE * -10时存在未决的CTRL-C中断,则WRITE会在清除输入缓冲区之前消除此中断。

输入缓冲区保存着从键盘到达的字符,甚至包括用户在例程执行READ命令之前键入的字符。这样,用户甚至可以在提示出现在屏幕上之前预先输入问题的答案。当READ命令从缓冲区中提取字符时,Caché将其回显到终端,以便问题和答案一起出现。当例程检测到错误时,可以使用* -1或* -10控件删除这些预先输入的答案。

输出缓冲器控制

* -3控件用于从输出缓冲区刷新数据,强制对物理设备执行写操作。因此,它首先将数据从设备缓冲区刷新到操作系统I / O缓冲区,然后强制操作系统将其I / O缓冲区刷新到物理设备。当强制立即写入磁盘上的顺序文件时,通常使用此控件。 Windows和UNIX平台支持* -3。在其他操作系统平台上,它是无操作的。

示例

在以下示例中,WRITE命令将变量var1中的当前值发送到当前输出设备。

  SET var1="hello world"
  WRITE var1

在下面的示例中,两个WRITE命令都显示pi的Unicode字符。第一个使用$ CHAR函数,第二个使用* integer参数:

/// d ##class(PHA.TEST.Command).TestInteger2()
ClassMethod TestInteger2()
{
	IF $SYSTEM.Version.IsUnicode()  {
	WRITE !,$CHAR(960)
	WRITE !,*960
	}
	ELSE {WRITE "本示例需要Caché的Unicode安装"}
}
DHC-APP>d ##class(PHA.TEST.Command).TestInteger2()
 
π
π

(请注意,上面的示例要求安装Caché的Unicode。)

下面的示例为每个名字写名字和姓氏值以及一个识别文本。WRITE命令在同一行上组合了多个参数。它等效于其后的示例中的两个WRITE命令。! character是一种产生换行符的格式控件。(请注意,当通过两个不同的WRITE命令输出文本时,仍需要!换行符。)

   SET fname="Bertie"
   SET lname="Wooster"
   WRITE "First name: ",fname,!,"Last name: ",lname

等价于

   SET fname="Bertie"
   SET lname="Wooster"
   WRITE "First name: ",fname,!
   WRITE "Last name: ",lname

在下面的示例中,假设当前设备是用户的终端。READ命令提示用户输入名字和姓氏,并将输入值分别存储在变量fname和lname中。WRITE命令显示fname和lname中的值以供用户确认。包含空格字符(“”)的字符串用于分隔输出名称。

/// d ##class(PHA.TEST.Command).TestWriteName()
ClassMethod TestWriteName()
{
Test
	READ !,"First name: ",fname
	READ !,"Last name: ",lname
	WRITE !,fname," ",lname
	READ !,"Is this correct? (Y or N) ",check#1
	IF "Nn"[check {
		GOTO Test 
	}
}
DHC-APP>d ##class(PHA.TEST.Command).TestWriteName()
 
First name: y
Last name: x
y x
Is this correct? (Y or N) N
First name: N
Last name: n
N n
Is this correct? (Y or N) Y

下面的示例将当前值写入client(1,n)节点。

/// d ##class(PHA.TEST.Command).TestSetElementValues()
ClassMethod TestSetElementValues()
{
SetElementValues
	SET client(1,1)="Betty Smith"
	SET client(1,2)="123 Primrose Path"
	SET client(1,3)="Johnson City"
	SET client(1,4)="TN"
DisplayElementValues
	SET n=1
	WHILE $DATA(client(1,n)) { 
		WRITE client(1,n),! 
		SET n=n+1 
	}
	RETURN
}
DHC-APP>d ##class(PHA.TEST.Command).TestSetElementValues()
Betty Smith
123 Primrose Path
Johnson City
TN

下面的示例写入对象实例属性的当前值:

   SET myoref=##class(%SYS.NLS.Format).%New()
   WRITE myoref.MonthAbbr
DHC-APP>SET myoref=##class(%SYS.NLS.Format).%New()

DHC-APP>WRITE myoref.MonthAbbr
 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

其中myoref是对象引用(OREF),而MonthAbbr是对象属性名称。注意,在对象表达式中使用点语法。在对象引用和对象属性名称或对象方法名称之间放置一个点。

下面的示例写入对象方法GetFormatItem()返回的值:

   SET myoref=##class(%SYS.NLS.Format).%New()
   WRITE myoref.GetFormatItem("MonthAbbr")
DHC-APP> SET myoref=##class(%SYS.NLS.Format).%New()
 
DHC-APP>WRITE myoref.GetFormatItem("MonthAbbr")
 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

下面的示例写入由对象方法SetFormatItem()返回的值。通常,由Set方法返回的值是该参数的先前值:

/// d ##class(PHA.TEST.Command).TestWriteOREF()
ClassMethod TestWriteOREF()
{
	SET myoref=##class(%SYS.NLS.Format).%New()
	SET oldval=myoref.GetFormatItem("MonthAbbr")
	WRITE myoref.SetFormatItem("MonthAbbr"," J F M A M J J A S O N D"),!
	WRITE myoref.GetFormatItem("MonthAbbr"),!
	WRITE myoref.SetFormatItem("MonthAbbr",oldval),!
	WRITE myoref.GetFormatItem("MonthAbbr"),!
}
DHC-APP> d ##class(PHA.TEST.Command).TestWriteOREF()
 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
 J F M A M J J A S O N D
 J F M A M J J A S O N D
 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

对象的write命令可以采用级联点语法的表达式,如以下示例所示:

 WRITE patient.Doctor.Hospital.Name

在此示例中,Patient.Doctor对象属性引用Hospital对象,该对象包含Name属性。因此,此命令将写入指定患者的医生所属医院的名称。对象方法可以使用相同的级联点语法。

对象的写命令可以与系统级方法一起使用,例如以下数据类型属性方法:

  WRITE patient.AdmitDateIsValid(date)

在此示例中,AdmitDateIsValid()属性方法返回当前患者对象的结果。AdmitDateIsValid()是用于AdmitDate属性的数据类型验证的布尔方法。因此,如果指定的日期是有效日期,此命令将写入1,如果指定的日期不是有效日期,则将写入0。

请注意,可以通过声明对象引用所引用的类或超类来进一步指定任何对象表达式。因此,上述示例也可以写成:

   WRITE ##class(Patient)patient.Doctor.Hospital.Name
   WRITE ##class(Patient)patient.AdmitDateIsValid(date)
注意

WRITE $ X和$ Y

WRITE以一次从左到右的顺序显示从表达式求值得到的字符。Caché在$ X和$ Y特殊变量中记录当前输出位置,其中$ X定义当前列位置,$ Y定义当前行位置。显示每个字符时,$ X递增1。

在下面的示例中,WRITE命令在写入11个字符的字符串Hello world后给出列的位置。

DHC-APP>  WRITE "Hello world"," "_$X," is the column number"
Hello world 11 is the column number

请注意,在显示的字符串和$X值 (," ",$X) 之间写入空格将导致该空格在求值之前递增 X ; 但 是 将 空 格 连 接 到 ‘ X;但是将空格连接到` X;但是将空格连接到‘X (," "_ X ) ‘ 会 显 示 空 格 , 但 不 会 在 求 值 之 前 递 增 ‘ X)` 会显示空格,但不会在求值之前递增` X)‘会显示空格,但不会在求值之前递增‘X`的值。

即使使用串联的空格,$ X或$ Y的显示当然也会增加$ X,如以下示例所示:

DHC-APP>WRITE $Y," "_$X
207 3
DHC-APP> WRITE $X," "_$Y
0 209
```java
在第一个`WRITE`中,`$ X`的值将增加`$ Y`值中的位数(这可能不是想要的)。在第二个`WRITE`中,`$ X`的值为0。

使用`$ X`,可以在`WRITE`命令期间显示当前列的位置。要在`WRITE`命令期间控制列的位置,可以使用`?`。格式控制字符。`?`仅当`$ X`位于第0列时,格式字符才有意义。在以下`WRITE`命令中,`?`执行缩进:
```java
DHC-APP>  WRITE ?5,"Hello world",!
     Hello world
 
DHC-APP>WRITE "Hello",!?5,"world"
Hello
     world

在WRITE中使用格式控件

f参数允许包括以下任何格式控制字符。当与终端输出一起使用时,这些控件确定输出数据在屏幕上的显示位置。可以指定格式控制字符的任意组合。

!格式控制字符

将一行移至第0列($ Y递增1,$ X设置为0)。实际的控制代码序列取决于设备。通常为ASCII 13(返回),或者ASCII 13和ASCII 10(LINE FEED)。

Caché不会对带有参数的WRITE执行隐式换行符。写入终端时,通常的好习惯是在每个WRITE命令中以!开头(或结束)!格式控制字符。

可以指定多个!格式控件。例如,要前进五行,请写!!!!!。可以结合!格式控件和其他格式控件。但是,请注意,尽管允许以下组合,但在大多数情况下没有意义:!#或!,#(前进一行,然后前进至新屏幕的顶部,将$ Y重置为0)和?5,!。 (缩进5,然后前进一行,取消增量)。组合?5!是不合法的。

如果当前设备是TCP设备,则!不输出RETURN和LINE FEED。相反,它将刷新保留在缓冲区中的所有字符,并将其通过网络发送到目标系统。

#格式控制字符

产生与将CR(ASCII 13)和FF(ASCII 12)字符发送到纯ASCII设备相同的效果。(确切的行为取决于操作系统类型,设备和记录格式。)

在终端上,#格式控制字符将清除当前屏幕,并从新屏幕的顶部0列开始。($ Y和$ X重置为0。)

以将#格式控件与其他格式控件结合使用。但是,请注意,尽管允许以下组合,但在大多数情况下没有意义:!#或!,#(前进一行,然后前进至新屏幕的顶部,将$ Y重置为0)和?5,# (缩进5,然后前进到新屏幕的顶部,撤消增量)。 5#组合不合法。

?n格式控制字符

此格式控件包含一个问号(?),后跟一个整数,或者一个计算结果为整数的表达式。它将输出定位在第n列位置(从第0列开始计数)并复位$ X。如果此整数小于或等于当前列位置n <$ X),则此格式控件无效。设置新列位置时,可以引用$ X特殊变量(当前列)。例如,?$ X + 3。第n列位置(从第0列开始计数)并重置$ X。

/助记符格式控制字符

此格式控件包含一个斜杠(/),后跟一个助记符关键字,以及(可选)一个要传递给助记符的列表参数。

/mnemonic(param1,param2,...)

Caché将助记符解释为活动助记符空间中定义的入口点名称。此格式控件用于执行诸如倒带或将光标放在屏幕上之类的设备功能。如果没有活动的助记符空间,则会导致错误。记忆库可能(也可能不需要)参数列表。

可以通过以下两种方式之一建立活动的助记符空间:

  • 转到管理门户,选择“系统”,“配置”,“设备设置”,“ IO设置”。查看和编辑文件,MagTape,其他或终端助记符空间设置。

  • 在设备的OPEN或USE命令中包括/ mnemonic space参数。

以下是助记符设备功能的一些示例:

Mnemonic 描述
/IC(n) 在当前光标位置为n个字符插入空格,将其余行向右移动
/DC(n) 删除光标右侧的n个字符并折叠线条
/EC(n) 擦除光标右侧的n个字符,并在其定位符中保留空白

指定格式控件序列

Caché允许指定一系列格式控件,并散布格式控件和表达式。在指定格式控件序列时,不需要在它们之间包含逗号分隔符(尽管允许使用逗号)。格式控件与表达式之间需要逗号分隔符。

在下面的示例中,WRITE命令将输出前进两行,并将第一个输出字符定位在由READ命令的输入建立的列位置。

/// d ##class(PHA.TEST.Command).TestWriteNUM()
ClassMethod TestWriteNUM()
{
	READ !,"Enter the number: ",num
	SET col=$X
	SET ans=num*num*num
	WRITE !!,"Its cube is: ",?col,ans
}
DHC-APP>d ##class(PHA.TEST.Command).TestWriteNUM()
 
Enter the number: 10
 
Its cube is:        1000

因此,输出列根据读取输入的字符数而不同。

通常,格式控件被指定为每个写命令的文字操作数。不能使用变量指定格式控件,因为它们将被解析为字符串,而不是可执行操作数。如果要创建多个WRITE命令使用的格式控件和表达式序列,可以使用#DEFINE预处理器指令定义宏,如下例所示:

/// d ##class(PHA.TEST.Command).TestWriteDef()
ClassMethod TestWriteDef()
{
	#Define WriteMacro "如果你看到这个",!,"出了点问题",##Continue
	$SYSTEM.Status.DisplayError($SYSTEM.Status.Error(x)),!!
	SET x=83
Module1
	/* code */
	WRITE $$$WriteMacro
Module2
	/* code */
	WRITE $$$WriteMacro
}
DHC-APP>d ##class(PHA.TEST.Command).TestWriteDef()
如果你看到这个
出了点问题
错误 #83: 错误代码=%11
 
如果你看到这个
出了点问题
错误 #83: 错误代码=%11

带WRITE的转义序列

WRITE命令与READ命令一样,都提供对转义序列的支持。转义序列通常用于格式化和控制操作。它们的解释特定于当前的设备类型。

要输出转义序列,请使用以下格式:

DHC-APP>  WRITE *27,"char"
har

其中*27是转义字符的ASCII代码,char是由一个或多个控制字符组成的文字字符串。需要用双引号括起来。

例如,如果当前设备是VT-100兼容终端,以下命令将擦除从当前光标位置到行尾的所有字符。

DHC-APP>WRITE *27,"[2J"

要为可以在多个平台上运行的程序提供设备独立性,请在程序开始时使用set命令将必要的转义序列分配给变量。然后,可以在程序代码中引用变量,而不是实际的转义序列。要使程序适应不同的平台,只需对使用set命令定义的转义序列进行必要的更改。然后,就可以引用变量而不是实际的转义序列。

WRITE与其他WRITE命令的比较

请参阅 第七章 疯狂Caché 命令(二) Write 命令