OpenVMS 用户手册
12.6.4 比较字符串
比较两个字符串时,字符串是一个字符接着一个字符进行比较。不同长度的字符串是不相同的 (例如,"dogs" 大于 "dog")。
比较准则是字符的 ASCII 值。按照这些准则,数字 0 至 9 小于大写字母 A 至 Z,而大写字母 A 至 Z 小于小写字母 a 至 z。当以下任意一个条件为真时,就结束字符串比较:
- 已比较所有字符,在那种字母大小写情况下字符串是相同的。
- 出现第一个不匹配。
表 12-1 列出不同类型的字符串比较。
表 12-1 字符串比较
比较 |
运算符 |
描述 |
等于
|
.EQS.
|
把一个字符串与另一个进行比较,检测是否相同。
|
大于或等于
|
.GES.
|
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较大的值或者相同。
|
大于
|
.GTS.
|
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较大的值。
|
小于或等于
|
.LES.
|
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较小的值或者相同。
|
小于
|
.LTS.
|
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较小的值。
|
不等 |
.NES.
|
把一个字符串与另一个进行比较,检测是否不同。
|
在以下所有例子中,假定符号 LAST_NAME 值为 "WHITFIELD"。
- 在以下例子中,符号 TEST_NAME 求值为 0
(假);符号 LAST_NAME 的值不等于文字
"HILL":
$ TEST_NAME = LAST_NAME .EQS. "Hill"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
|
- 在以下例子中,符号 TEST_NAME 求值为 1 (真);符号 LAST_NAME 的值大于或等于文字 "HILL":
$ TEST_NAME = LAST_NAME .GES. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
|
- 在以下例子中,符号 TEST_NAME 求值为 1 (真);符号 LAST_NAME 的值大于文字
"HILL":
$ TEST_NAME = LAST_NAME .GTS. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
|
- 在以下例子中,符号 TEST_NAME 求值为 0 (假);符号 LAST_NAME 的值不小于或等于文字 "HILL":
$ TEST_NAME = LAST_NAME .LES. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
|
- 在以下例子中,符号 TEST_NAME 求值为 0 (假);符号 LAST_NAME 的值不小于文字
"HILL":
$ TEST_NAME = LAST_NAME .LTS. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
|
- 在以下例子中,符号 TEST_NAME 求值为 1 (真);符号 LAST_NAME 的值不等于文字
"HILL":
$ TEST_NAME = LAST_NAME .NES. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
|
12.6.5 替换子串
指定替换字符串的位置和大小,可以用另一个字符串替换一个字符串的一部分。局部符号的格式是:
symbol-name[offset,size] := replacement-string
|
全局符号的格式是:
symbol-name[offset,size] :== replacement-string
|
各元素如下所示:
offset
|
一个整数,指出替换字符串相对于原始字符串首位字符的位置。偏移 0 是指符号的首位字符,偏移 1 是指第二个字符,以此类推。 |
size
|
一个整数,指出替换字符串的长度。 |
要替换子串,遵守以下规则:
- 方括号是需要的符号。在符号名和左中括号之间不允许有空格。
- 大小和偏移值的整数值范围可以从 0 至 768。
- 替换字符串必须是一个字符串
。
- 指定的符号名可以是最初未定义的。赋值语句建立符号名,如果有必要,在符号值中提供前导或尾随空格。
- 可以指定偏移和大小来建立一个表示空白行的符号。
按列排列记录使列表更易于读取和排序。可以使用这个格式指定如何存储数据。
在以下例子中,第一个赋值语句为符号 A 给出值 PACKRAT。第二个语句指定 MUSK
替换 A 值的前四个字符。其结果是 A 成为 MUSKRAT。
$ A := PACKRAT
$ A[0,4] := MUSK
$ SHOW SYMBOL A
A = "MUSKRAT"
|
在以下例子中,符号 B 以前没有值,因而它被给定一个前导
四个空格并尾随 RAT 的值:
在以下例子中,一个 80 个空白空格的值赋值给符号 LINE:
在以下例子中,第一个语句使用 NAME 的值填充 DATA 的前 15 列。第二个语句用 GRADE 的值填充第 18 列。第 16 和 17
列包含空白:
$ DATA[0,15] := 'NAME'
$ DATA[17,1] := 'GRADE'
|
12.7 使用数值和表达式
一个数可以有以下值:
- 十进制 --- ASCII 字符 0 至 9
- 十六进制 --- ASCII 字符 0 至 9 和 A 至 F
- 八进制 --- ASCII 字符 0 至 7
赋值给符号的数范围必须在 --2147483648 至 2147483647 (十进制)。如果一个指定的或计算的数超出这个范围,则不会报告出错,但会得出一个错误结果
。12.7.1 指定数
在 DCL 命令级和在命令过程中,如下所示指定一个数:
- 正数
键入适当的数字指定一个正数。 - 负数
在负数之前带一个减号 ( - )。
- 基数
在数 (但不是减号) 之前为十六进制数前导 %X 而为八进制数前导 %0,指定一个非十进制为基的数。 - 小数
一个数不能包括十进制小数点。在计算中,小数部分被截取。例如,8 除 3
等于 2。
在以下例子中,数 13 赋值给符号
DOG_COUNT:
$ DOG_COUNT = 13
$ SHOW SYMBOL DOG_COUNT
DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015
|
在以下例子中,负数 ( -15237 ) 用减号 ( - ) 表示:
$ BALANCE = -15237
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
|
在以下例子中,十六进制数 D 用前缀 %X 表示:
$ DOG_COUNT = %XD
$ SHOW SYMBOL DOG_COUNT
DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015
$ BALANCE = -%X3B85
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
|
12.7.2 数的内部存储
数在内部存储为有符号的 4 字节整数,称为长字;正数的值
从 0 到 2147483647,而负数的值为 4294967296
减去这个数绝对值。例如,数 -15237
存储为 4294952059。对于 ASCII
或十进制显示,负数转回减号格式;然而,对于十六进制和八进制显示,它们是不转换的。例如,数 -15237 显示为十六进制 FFFFC47B (十进制 4294952059),而不是十六进制 -00003B85。
使用 ASCII 惯例以数字串格式把数存储在文本文件中 (例如,数字 1 有存储值 49)。
在数字表达式中,包括的值必须是文字数 (例如 3) 或带数值的符号。另外,可以使用表示数的字符串 (例如,"23" 或 "-51")。如果在一个数和一个字符串之间执行一个操作或比较,DCL 把字符串转换为一个数。
数字表达式组合以下值 (称为整数操作数):
- 整数。例如:
- 求值为整数的词法函数。例如:
$ B = F$INTEGER("-9" + 23)
|
- 有整数值的符号。例如:
在前面的例子中,符号 B 表示 F$INTEGER 函数返回的整数值
( -923 )。
这些整数操作数可以通过算术、逻辑和比较运算符连接在一起,如以下几节所述。12.7.3 执行算术运算
可以指定以下算术运算:
- 乘法
星号 (*) 乘两个数。
- 除法
斜杠 (/) 用第二个指定数去除第一个指定数。如果一个数不能整除,那么将失去余数。不发生舍入。 - 加法
加号 (+) 加两个数。 -
减法
减号 (-) 从第一个指定数减去第二个指定数。 - 一元加减
加号和减号更改在它们之后的数的符号。
例子
- 以下例子示范当赋值一个符号时使用乘法:
$ BALANCE = 142 * 14
$ SHOW SYMBOL BALANCE
BALANCE = 1988 Hex = 000007C4 Octal = 00000003704
|
- 以下例子示范当赋值一个符号时使用除法:
$ BALANCE = BALANCE / 14
$ SHOW SYMBOL BALANCE
BALANCE = 142 Hex = 0000008E Octal = 00000000216
|
- 以下例子示范当赋值一个符号时使用加法:
$ BALANCE = BALANCE + 37
$ SHOW SYMBOL BALANCE
BALANCE = 179 Hex = 000000B3 Octal = 00000000263
|
- 以下例子示范当赋值一个符号时使用减法:
$ BALANCE = BALANCE - 15416
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 00000142173
|
- 以下例子示范使用一元减符号更改数 -142 的符号:
$ BALANCE = -(- a142)
$ SHOW SYMBOL BALANCE
BALANCE = 142 Hex = 0000008E Octal = 00000000216
|
12.7.4 比较数
表 12-2 列出不同类型的数字比较。
表 12-2 数字比较
比较 |
运算符 |
描述 |
等于
|
.EQ.
|
把一个数与另一个数进行比较,检测是否相同。
|
大于或等于
|
.GE.
|
把一个数与另一个数进行比较,检测是否第一个数有较大的值或者相同。
|
大于
|
.GT.
|
把一个数与另一个数进行比较,检测是否第一个数有较大的值。
|
小于或等于
|
.LE.
|
把一个数与另一个数进行比较,检测是否第一个数有较小的值或者相同。
|
小于
|
.LT.
|
把一个数与另一个数进行比较,检测是否第一个数有较小的值。
|
不 等于
|
.NE.
|
把一个数与另一个数进行比较,检测是否不同。 |
在以下例子中,假定符号 BALANCE 有值
-15237。
- 在以下例子中,TEST_BALANCE 求值为 1 (真);BALANCE 等于 -15237:
$ TEST_BALANCE = BALANCE .EQ. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
|
- 在以下例子中,TEST_BALANCE 求值为 1 (真);BALANCE 大于或等于 -15237:
$ TEST_BALANCE = BALANCE .GE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
|
- 在以下例子中,TEST_BALANCE 求值为 0 (假);BALANCE 不大于 -15237:
$ TEST_BALANCE = BALANCE .GT. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
|
- 在以下例子中,TEST_BALANCE 求值为 1 (真);BALANCE 小于或等于 -15237:
$ TEST_BALANCE = BALANCE .LE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
|
- 在以下例子中,TEST_BALANCE 求值为 0 (假);BALANCE 不小于 -15237:
$ TEST_BALANCE = BALANCE .LT. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
|
- 在以下例子中,TEST_BALANCE 求值为 0 (假);BALANCE 等于 -15237:
$ TEST_BALANCE = BALANCE .NE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
|
12.7.5 执行数字覆盖
使用赋值语句的特殊格式,可以对当前符号值执行二进制 (位级) 覆盖。对于局部符号,格式是:
symbol-name[bit-position,size] = replacement-expression
|
对于全局符号,格式是:
symbol-name[bit-position,size] == replacement-expression
|
各元素如下所示:
bit-position
|
一个整数,指出发生覆盖的相对于位 0 的位置。
|
size
|
一个整数,指出覆盖的位数。
|
要使用数字覆盖,遵守以下规则:
- 方括号 ([]) 是需要的符号。不允许在符号名和左中括号之间有空格。
- 文字值假定为十进制数。
- 大小 (size) 的最大长度是 32 位。
- 替换表达式必须是一个数字表达式。
- 当 symbol-name 未定义或者已定义为字符串时,覆盖的结果是字符串。否则,结果是整数。
以下例子中定义符号 BELL 的值为 7。BELL 的低位字节有二进制值 00000111。把偏移 5 的 0 更改为 1 (从 0 开始,从右到左计算位数),可以建立二进制值 00100111 (十进制值 39):
$ BELL = 7
$ BELL[5,1] = 1
$ SHOW SYMBOL BELL
BELL = 39 Hex = 00000027 Octal = 00000000047
|
12.8 使用逻辑值和表达式
以下几节描述如何使用逻辑值和表达式。
12.8.1 逻辑操作
有些操作把数和字符串解释为带值的逻辑数据,如下所示:
- 真值
如果一个数是奇数 (即,最低位是 1),这个数有逻辑真值。如果字符串的首位字符是大写字母或小写字母的 T 或 Y,那么这个字符串有逻辑真值。 - 假值
如果一个数是偶数 (即,最低位是 0),这个数有逻辑假值。如果字符串的首位字符不是大写字母或小写字母的 T 或
Y,那么这个字符串有逻辑假值。
在以下例子中,DOG_COUNT 赋值为 13。IF
STATUS 意味着如果 STATUS 的逻辑值为真。
$ STATUS = 1
$ IF STATUS THEN DOG_COUNT = 13
|
$ STATUS = "TRUE"
$ IF STATUS THEN DOG_COUNT = 13
|
12.8.2 逻辑表达式
逻辑操作影响操作数的所有位。逻辑表达式的值是整数,而且其表达式的结果也是整数。如果在逻辑表达式中指定一个字符串值,那么在表达式求值之前字符串转换为一个整数。
通常,使用逻辑表达式求值逻辑值的最低位;即是说,要确定其值是否为真或为假。可以指定以下逻辑操作:
- .NOT.
运算符 .NOT. 使逻辑值的位配置反向。一个真值成为假。而一个假值成为真。 - .AND.
运算符 .AND. 结合两个逻辑值,如下所示:
位级 |
实体级 |
1 .AND. 1 = 1
|
true .AND. true = true
|
1 .AND. 0 = 0
|
true .AND. false = false |
0 .AND. 1 = 0
|
false .AND. true = false
|
0 .AND. 0 = 0
|
false .AND. false = false |
- .OR.
运算符 .OR. 结合两个逻辑值,如下所示:
位级 |
实体级 |
1 .OR. 1 = 1
|
true .OR. true = true
|
1 .OR. 0 = 1
|
true .OR. false = true
|
0 .OR. 1 = 1
|
false .OR. true = true
|
0 .OR. 0 = 0
|
false .OR. false = false
|
以下例子把真值反向为假。表达式求值为 -2;其值是偶数,因此为假:
$ SHOW SYMBOL STATUS
STATUS = 1 Hex = 00000001 Octal = 00000000001
$ STATUS = .NOT. STATUS
$ SHOW SYMBOL STATUS
STATUS = -2 Hex = FFFFFFFE Octal = 37777777776
|
以下例子结合一个真值和一个假值,从而产生一个假值:
$ STAT1 = "TRUE"
$ STAT2 = "FALSE"
$ STATUS = STAT1 .AND. STAT2
$ SHOW SYMBOL STATUS
STATUS = 0 Hex = 00000000 Octal = 00000000000
|
以下例子结合一个真值和一个假值,从而产生一个真值:
$ STAT1 = "TRUE"
$ STAT2 = "FALSE"
$ STATUS = STAT1 .OR. STAT2
$ SHOW SYMBOL STATUS
STATUS = 1 Hex = 00000001 Octal = 00000000001
|
|