[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here

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 的值:


$ B[4,3] := RAT

在以下例子中,一个 80 个空白空格的值赋值给符号 LINE:


$ LINE[0,80]:= " "

在以下例子中,第一个语句使用 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 把字符串转换为一个数。

数字表达式组合以下值 (称为整数操作数):

  • 整数。例如:


    $  COUNT = 1
    
  • 求值为整数的词法函数。例如:


    $  B = F$INTEGER("-9" + 23)
    
  • 有整数值的符号。例如:


    $  A = B - 6
    

    在前面的例子中,符号 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


前页 后页 目录 索引