文章目录

第四十四章 Caché 命令大全 ZREMOVE 命令

从当前例程中删除一行或一系列行,或卸载当前例程。

大纲
ZREMOVE:pc lineref1:lineref2 ,...
ZR:pc lineref1:lineref2 ,...

参数

  • pc 可选-后置条件表达式。
  • lineref1 可选-单行或要删除的行范围中的第一行的位置。可以指定为文字(+5)或变量(+ a)。如果省略lineref1,则ZREMOVE会删除整个当前例程。
  • :lineref2 可选-要删除的一系列行中最后一行的位置。
描述

ZREMOVE命令在当前进程的当前加载例程上运行。使用ZLOAD加载当前例程。 ZLOAD加载例程的INT代码版本。 INT代码不计算或不包含预处理程序语句。不管是在源代码中还是在多行注释中,INT代码都不会计算或不包含例程的MAC版本中的空白行。一旦例程被加载,它将成为所有名称空间中当前进程的当前加载例程。因此,可以从任何名称空间(而不仅仅是从其加载的名称空间)插入或删除行,显示,执行或卸载当前加载的例程。

从终端输入ZREMOVE命令或使用XECUTE命令或$XECUTE函数调用它时,才可以使用ZREMOVE命令。在例程主体中指定ZREMOVE会导致编译错误。从例程中执行ZREMOVE的任何尝试也会产生错误。

ZREMOVE有两种形式:

  • 不带参数的情况下将卸载当前例程。
  • 带参数的对象会从当前例程中删除一行或多行ObjectScript源代码。
无参

不带参数的ZREMOVE会删除(卸载)当前加载的例程。在无参数ZREMOVE之后,$ZNAME返回空字符串,而不是当前例程的名称,并且ZPRINT不显示任何行。因为该例程已被删除,所以您不能使用ZSAVE保存该例程。尝试这样做会导致<COMMAND>错误。

以下终端会话显示了此操作:

DHC-APP>ZLOAD PHA.TEST.Command
 
DHC-APP>WRITE $ZNAME
PHA.TEST.Command
DHC-APP>ZREMOVE
 
DHC-APP>WRITE $ZNAME
 

无参数ZREMOVE可以指定后置条件表达式。

具有参数的ZREMOVE可以删除当前例程的所有行,但不能删除当前例程本身。例如,ZREMOVE +1:NonexistentLabel·删除当前例程的所有行,但可以使用ZINSERT插入新行,并使用ZSAVE保存该例程。

有参

具有参数的ZREMOVE会删除当前例程中的代码行。 ZREMOVE lineref1删除指定的行。 ZREMOVE lineref1:lineref2删除从第一个参考线开始到第二个参考线结束(包括两端)的行范围。它将编辑指针前进到删除的行之后。因此,ZREMOVE lineref1后跟ZINSERT会替换指定的行。

ZREMOVE可以通过指定lineref1或lineref1:lineref2参数的任何组合的逗号分隔序列来删除ObjectScript源代码的多行(或多个范围)。每个指定的行或代码行范围都按照指定的顺序作为单独的删除操作删除。

可以使用ZPRINT显示当前加载的例程的多行。可以使用DO命令执行当前例程。

仅影响例程的本地副本,而不影响存储在磁盘上的例程。要存储修改后的代码,必须使用ZSAVE命令保存例程。

以下终端会话显示了此操作。本示例使用一个虚拟例程(^myroutine),其中每行将变量设置为命名该行的字符串:

DHC-APP>ZLOAD PHA.TEST.Command
 
DHC-APP>ZPRINT +8
         WRITE "E is Epsilon",!
 
DHC-APP>ZREMOVE +8
 
DHC-APP>PRINT +8
         /* Not sure about E */
 
参数

pc

可选的后置条件表达式。如果后置条件表达式为true(计算为非零数值),则Caché执行命令。如果后置条件表达式为假(计算为零),则Caché不执行命令。

lineref1

要删除的行,或者要删除的行中的第一个。它可以采用以下任何一种格式:

  • +offset 指定例程中的行号。从1开始计数的正整数。
  • label 在例程中指定标签。 ZREMOVE标签仅擦除标签行本身。这包括该行标签后面的所有代码。
  • label+offset 指定标签和要在标签部分中偏移的行数,将标签行计为第1行。

标签的长度可能超过31个字符,但在前31个字符内必须唯一。 ZREMOVE仅匹配指定标签的前31个字符。标签名称区分大小写,并且可能包含Unicode字符。

可以使用lineref1指定要删除的单行代码。可以将代码行指定为距例程开头的偏移量(+ lineref1),也可以指定为距指定标签的偏移量(label + lineref1)。

  • ZREMOVE +7:从例行程序开始算起第七行。
  • ZREMOVE +0:不执行任何操作,不产生任何错误。
  • ZREMOVE +999:如果999大于例程中的行数,则不执行任何操作,也不产生错误。
  • ZREMOVE Test1: 删除标签行Test1。
  • ZREMOVE Test1+0:删除标签行Test1。
  • ZREMOVE Test1+1:删除标签行Test1之后的第一行。
  • ZREMOVE Test1+999: 删除标签行Test1之后的第999行。该行可能在另一个标记的模块中。如果999大于从标签Test1到例程结尾的行数,则不执行任何操作,不产生错误。

INT代码行包括在例程的MAC版本中找到的所有标签,注释和空格,但编译器删除的MAC例程中的完全空白行既不显示也不在INT代码中计数。多行注释中的空白行也将被删除。 MAC代码中的#;##;///注释可能不会出现在INT代码中,因此可能会影响行数和偏移量。

lineref2

范围中要删除的最后一行。以用于lineref1的任何格式指定lineref2。冒号前缀(:)是必需的。

可以将行的范围指定为+ lineref1:+ lineref2。 ZREMOVE删除行的范围,包括lineref1和lineref2。如果lineref1和lineref2引用同一行,则ZREMOVE会删除该单行。

如果lineref2在例程代码中早于lineref1出现,则不执行任何操作,也不产生错误。例如:ZREMOVE +7:+ 2ZREMOVE Test1 + 1:Test1ZREMOVE Test2:Test1将不执行任何操作。

注意:在lineref2中指定标签名称时请小心。标签名称区分大小写。如果lineref2包含例程中不存在的标签名称,则ZREMOVE会删除从lineref1到例程末尾的行范围。

示例

此命令将删除当前例程中的第四行。

 ZREMOVE +4

该命令擦除标签Test1之后的第六行; Test1被计为第一行。

  ZREMOVE Test1+6

此命令将删除当前例程中的第3行到第10行(包括3行和10行)。

   ZREMOVE +3:+10

在当前例程中,此命令通过紧随其后的行删除标签行Test1

 ZREMOVE Test1:Test1+1

此命令在当前例程中擦除从标签Test1到标签Test2的所有行,包括两个标签。

   ZREMOVE Test1:Test2