[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here

OpenVMS 用户手册


前页 目录 索引

12.8.3 逻辑操作结果

以下表格示范基于逐位和逐数字的逻辑操作结果。在逻辑操作中,从大写字母或小写字母 T 或 Y 开始的字符串被视为数 1;从任何其他字符开始的字符串被视为数 0。在逻辑操作中,奇数为真值,而偶数和零为假值。

给定:     结果是:
位 A 位 B   .NOT. A A .AND. B A .OR. B
1 1   0 1 1
1 0   0 0 1
0 1   1 0 1
0 0   1 0 0
给定:     结果是:
数 A 数 B   .NOT. A A .AND. B A .OR. B
 
 
 
 

12.8.4 使用词法函数的返回值

词法函数通常在命令过程中使用,它从系统检索信息,包括有关系统过程、批量和打印队列和用户进程的信息。也可以使用词法函数处理字符串和翻译逻辑名。当把一个词法函数赋值给一个符号时,这个符号就等于这个词法函数返回的信息 (例如,一个数或字符串)。然后在 DCL 级,可以用 DCL 命令 SHOW SYMBOL 显示这个信息。在命令过程中,存储在符号上的信息以后可以使用在过程中。有关词法函数的详情,请参阅第 15 章

要使用词法函数,需指定词法函数的名称 (它总是从 F$ 开始) 和它的变元列表。使用以下格式:


F$function-name(args[,...])

变元列表跟随函数名,可以带任何数目的插入空格和制表符。

当使用词法函数时,遵守以下规则:

  • 把变元列表括入圆括号内。
  • 在这个列表中,以准确次序指定变元,并且用逗号分开;即使省略可选变元,也不能省略逗号。
  • 如果不需要变元,那么键入空的圆括号。
  • 遵循以下规则编写表达式: 把字符串括入引号内;不把整数、符号和词法函数括入引号内。

以使用字符串、整数和符号同样的方法使用词法函数。在表达式中使用词法函数时,DCL 自动求出函数的值,并用它的返回值替换这个函数。

在以下例子中,F$LENGTH 函数返回指定为变元的 BUMBLEBEE 的值长度。DCL 自动确定返回值 (9),并使用这个值来求出表达式的值。
因此,表达式 (9 + 1) 的结果是 10,并且把这个值赋给符号 SUM:


$ SUM = F$LENGTH("BUMBLEBEE") + 1
$ SHOW SYMBOL SUM
  SUM = 10   Hex = 0000000A  Octal = 00000000012

注意,每个词法函数返回的信息是一个整数或者是一个字符串。另外,必须为词法函数指定一个表示整数或字符串的变元。

例如,F$LENGTH 函数需要一个字符串表达式的变元,并返回整数值。在上一个例子中,变元 "BUMBLEBEE" 是字符串表达式,而返回值 (9) 是整数。

可以在使用符号的任何位置使用词法函数。在符号替换的位置,必须强制把符号括入省略号内 (请参阅 12.12 节),词法函数求值必须强制把词法函数放入省略号内。词法函数也可以用作其他词法函数的变元值。

以下例子展示可以为 F$LENGTH 函数指定变元的不同方法。在每个例子中,变元是字符串表达式。

  • 以下例子展示一个用作变元的符号:


    $ BUG = "BUMBLEBEE"
    $ LEN = F$LENGTH(BUG)
    $ SHOW SYMBOL LEN
      LEN = 9   Hex = 00000009  Octal = 00000000011
    

    把符号 BUG 用作变元时,不用引号括住它。词法函数自动用值 "BUMBLEBEE" 代替 BUG,确定其长度,并返回值 9。
  • 以下例子展示包含符号和字符串的变元:


    $ BUG = "BUMBLEBEE"
    $ LEN = F$LENGTH(BUG)
    $ SHOW SYMBOL LEN
      LEN = 9   Hex = 00000009  Octal = 00000000011
    $ LEN = F$LENGTH(BUG + "S")
    $ SHOW SYMBOL LEN
      LEN = 10   Hex = 0000000A  Octal = 00000000012
    

    符号 BUG 不括入引号,而字符串 "S" 要括入。变元必须在 F$LENGTH 函数可以确定其长度之前求值。符号 BUG 表示的值 ("BUMBLEBEE") 与字符串 "S" 连接;其结果是 "BUMBLEBEES"。F$LENGTH 函数确定字符串 "BUMBLEBEES" 的长度并返回值 10。
  • 以下例子为 F$LENGTH 函数使用另一个词法函数作为变元。F$DIRECTORY 函数返回当前默认目录的名称,并且包括方括号。在以下例子中,当前默认目录是 [SALMON]。


    $ LEN = F$LENGTH(F$DIRECTORY())
    $ SHOW SYMBOL LEN
      LEN = 8   Hex = 00000008  Octal = 00000000010
    

把 F$DIRECTORY 函数用作变元时,不必使用引号;这个函数自动求值。F$DIRECTORY 函数的结果必须在 F$LENGTH 函数可以确定其长度之前返回。然后,F$LENGTH 函数确定默认目录的长度,并且包括方括号。

12.8.5 操作次序

一个表达式可以包含很多运算和比较。如果在表达式中有两个或更多运算符时它们的求值次序见下表。运算符列出次序从最高优先权到最低优先权;即是说,在表顶部的运算符在底部的运算符之前执行。

优先权 运算
7 一元加 (+) 和一元减 (-)
6 乘法 (*) 和除法 (/)
5 字符串加 (串联) 和减 (缩减)
4 所有数字和字符比较
3 逻辑 .NOT. 操作
2 逻辑 .AND. 操作
1 逻辑 .OR. 操作

如果表达式包含具有同样优先权次序的运算符,那么运算是从左至右执行。把要先执行的运算放入圆括号内,可以取代正常的优先权次序 (运算和比较求值的次序)。圆括号也可以嵌套 。

在以下例子中,圆括号强制加法在乘法之前执行。如果不用圆括号,那么乘法先执行,结果是 26:


$ RESULT = 4 * (6 + 2)
$ SHOW SYMBOL RESULT
  RESULT = 32   Hex = 00000020  Octal = 00000000040

12.8.6 求值的数据类型

DCL 对符号的求值结果是字符串或者是整数值。符号的数据类型 (字符或整数) 由当前赋值的数据类型确定。其数据类型不是永久的: 如果值更改了数据类型,那么符号也更改其数据类型。

表达式可以有整数或字符串值,这取决于值的类型和使用的运算符,。

在以下例子中,局部符号 NUM 先赋予一个字符值,然后当赋值一个整数表达式时转换为一个整数值:


$ NUM = "ABC"
$ NUM = 2 + 5

以下表格概述 DCL 如何对表达式求值。第一列列出表达式可以包含的不同值和运算符。对于每种情况,第二列告诉整个表达式等于什么。在表中,任何值代表字符串或整数。

表达式 结果
值类型
整数值 整数
字符串值 字符串
整数词法函数 整数
字符串词法函数 字符串
整数符号 整数
字符串符号 字符串
+、- 或 .NOT. 任何值 整数
任何值 .AND. 或 .OR. 任何值 整数
字符串 + 或 - 字符串 字符串
整数 + 或 - 任何值 整数
任何值 + 或 - 整数 整数
任何值 * 或 / 任何值 整数
任何值 (字符串比较) 任何值 整数
任何值 (数字比较) 任何值 整数

12.9 在表达式中转换值的类型

在 DCL 可以求值表达式之前,在表达式中的所有操作数必须具有同样的值数据类型。值有字符串或整数数据类型。字符串数据包括字符串、带字符串值的符号和返回字符串值的词法函数。整数数据包括整数、带整数值的符号和返回整数值的词法函数。当表达式包含数和字符串操作数时,DCL 把所有字符串转换为整数,或者把所有整数转换为字符串。

一般而言,如果使用字符串和整数值,那么字符串值转换为整数。唯一的例外是当 DCL 执行字符串比较时。在这些比较中,整数转换为字符串。

另外,以下词法函数确定或更改表达式的值:

  • F$TYPE --- 确定符号的当前值类型
  • F$INTEGER --- 把字符串表达式转换为整数值
  • F$STRING --- 把整型表达式转换为字符串值

12.9.1 把字符串转换为整数

按以下方法把字符串转换为整数:

  • 包含数的字符串转换为它们的整数值。例如,字符串 "45" 转换为整数 45。
  • 如果字符串从 T、t、Y 或 y 开始,那么将它转换为整数 1。
  • 如果字符串从任何其他字母开始,则将它转换为整数 0。

下表展示字符串转换为整数值的例子:

字符串 作为结果的整数
"123" 123
"12XY" 0 (假)
"Test" 1 (真)
"hello" 0 (假)

12.9.2 把整数转换为字符串

当整数被转换为字符串时,作为结果的字符串包含对应于整数值的数。下表展示整数如何被转换为字符串值:

整数 作为结果的字符串
123 "123"
1 "1"
0 "0"

12.10 理解符号表

符号存储在局部或全局符号表,它们由操作系统维护。

12.10.1 局部符号表

DCL 维护一个局部符号表,用于您的主要进程和当执行一个命令过程、使用 CALL 命令或提交批量作业时建立的每个命令级。当建立局部符号时,DCL 把符号放入当前命令级的局部符号表。在命令级的整个活动期间,DCL 为这个命令级维护 这个局部符号表;当一个命令级不再活动时,它的局部符号表 (和它包含的所有符号) 被删除。有关进程、命令过程和批量作业的详情,请参阅第 16 章

除您建立的局部符号之外,局部符号表包含 DCL 维护的 8 个符号。这些符号,命名为 P1、P2,以此类推,直至 P8,用于传送参数给命令过程。传送给命令过程的参数被当作字符串。否则,P1 至 P8 定义为空字符串 ("")。它们存储在局部符号表中。

12.10.2 全局符号表

DCL 在进程期间只维护一个全局符号表,并把所有全局符号放入这个表中。除您建立的全局符号之外,全局符号表包含保留的全局符号。这些全局符号给出有关程序和命令过程以及系统指令和公用程序的状态信息。

$STATUS 保留的全局符号

$STATUS 是大多数最近执行命令返回的条件代码。符号 $STATUS 符合 OpenVMS 操作系统消息代码的格式。应用程序把一个参数值包括在 EXIT 命令中,可以设置全局符号 $STATUS 的值。系统使用 $STATUS 的值确定显示哪一条消息 (如果存在),并确定是否在下一个更高命令级继续执行 。$STATUS 最低三个位的值放入全局符号 $SEVERITY 中。

$SEVERITY 保留的全局符号

$SEVERITY 是大多数最近执行命令返回的条件代码的严重级。符号 $SEVERITY 等于 $STATUS 最低三个位,可以有以下值:

0 警告
1 成功
2 出错
3 信息
4 严重的 (致命) 出错

$RESTART 保留的全局符号

如果一个批量作业因系统失败中断后重新启动,那么 $RESTART 有值 TRUE。否则,$RESTART 有值 FALSE。

12.10.3 符号表搜索次序

当命令解释程序确定一个符号的值时,它按以下次序搜索符号表:

  1. 当前命令级的局部符号表
  2. 每个上一命令级的局部符号表,当前级向后搜索
  3. 全局符号表

12.11 屏蔽符号的值

以下几节描述如何屏蔽值符号。

12.11.1 SET SYMBOL 命令

按照默认,所有符号 (全局和局部) 定义在内部过程级可存取的外部命令过程级。然而,使用 SET SYMBOL 命令,可以把命令过程的局部或全局符号从其他命令过程定义的符号隔离出来。SET SYMBOL 命令屏蔽局部和全局符号的值,而不删除它们。因而,如果一个命令过程执行另一个命令过程,并且在第二个过程中指定 SET SYMBOL 命令,您就可以在两个过程中使用同样的符号名。

SET SYMBOL 命令也控制 DCL 是否在处理命令行之前尝试把动词字符串 (在命令行中的第一个字) 翻译为一个符号。其默认行为是尝试翻译。更改这个行为的优点是当一个命令过程调用一个命令时,它不会受到外部过程级环境的影响。

12.11.2 符号作用域状态

符号作用域对局部符号和全局符号是不同。当您退出一个过程级返回到上一个过程时,就为局部符号和全局符号恢复上一级符号作用域上下文。

要显示当前、一般的符号作用域状态,使用词法函数 F$ENVIRONMENT("SYMBOL_SCOPE")。要显示当前动词作用域状态,使用词法函数 F$ENVIRONMENT("VERB_SCOPE")。

局部符号作用域

局部符号依赖于过程级。如果在外部过程级定义一个局部符号,这个符号可以在任何内部过程级被读取 (而不是写入)。如果把一个值赋给一个外部过程级的局部符号,就在当前过程级建立一个新符号。然而,在外部过程级的这个符号没有被修改。

SET SYMBOL/SCOPE=NOLOCAL 命令使当前过程级和任何内部级不可存取定义在外部过程级的所有局部符号。例如,如果在过程级 2 和 4 指定 SET SYMBOL/SCOPE=NOLOCAL,那么:

  • 过程级 2 只可以读取和写入级 2 的局部符号。
  • 过程级 3 可以读取 (但是不能写入) 级 2 的局部符号。级 3 也可以读取和写入级 3 的局部符号。
  • 过程级 4 只可以读取和写入级 4 的局部符号。

全局符号作用域

全局符号与过程级无关。当前全局符号作用域上下文以后可应用于所有过程级。

/SCOPE=NOGLOBAL 限定词使所有后续命令不可存取所有全局符号,直到指定 /SCOPE=GLOBAL 限定词或者退出这个过程到可存取全局符号的上一级。另外,指定 /SCOPE=NOGLOBAL 限定词使您不能建立任何新的全局符号,直到指定 /SCOPE=GLOBAL 限定词。


前页 后页 目录 索引