Tivoli 服务台 6.0 开发工具包脚本程序设计指南
本章包括处理测试的条件结构和控制结构以及对测试条件的响应。这些结构也提供按需要改变程序流程和重复操作的方法。
开发工具包提供两种条件结构:
开发工具包提供几种结构用于改变程序流程:
开发工具包 IF 语句的一般形式是:
IF <条件> THEN <语句列表> ELSIF <第二个条件> THEN <语句列表> ELSE <语句列表> END;
如果只测试一个条件,则不需要 ELSIF 与 ELSE 语句。
这种结构的使用实例是:
IF (age < 18) OR (age > 90) THEN WRITELN('Improper age, please re-enter'); END;
IF display = 'CGA' THEN LoadCGADriver; ELSIF display = 'MCGA' THEN LoadMCGADriver; ELSIF display = 'EGA' THEN LoadEGADriver; ELSE LoadVGADriver; END;
IF processor = '8086' THEN maxMem := 640000; operatingSystem := 'DOS'; ELSE maxMem := 16000000; operatingSystem := 'OS/2'; (* operatingSystem is a string *) END;
IF 和 ELSIF 总是后跟布尔条件。如果条件为 TRUE,执行 IF 或 ELSIF 后的语句。
如果条件求值为 FALSE,出现下列三种情况之一:
开发工具包使用短路布尔求值。这意味着:
WHEN 语句是 IF 语句的特殊形式,它使用户能根据变量或表达式的值执行操作。
考虑下列 IF 语句:
IF i*j = 1 THEN WriteOne; ELSIF i*j = 2 THEN WriteTwo; ELSIF i*j = 3 THEN WriteThree; ELSE WriteOther; END;
在前面实例中,检查从表达式 i*j 返回的值包括对每个输入值重新计算表达式。如果 i*j 大于 3,三次求值表达式 i*j。
此方法有两个负面影响:
一种替代方法是把 i*j 的值赋给一个本地变量,然后在 IF 语句中使用该变量。
对维护和性能一种更好的解决方法是使用 WHEN 语句,而不使用 IF 语句。
开发工具包 WHEN 语句提供求值条件的更好的方法,如下面所示。
WHEN i*j IS 1 THEN WriteOne; ELSWHEN 2 THEN WriteTwo; ELSWHEN 3 THEN WriteThree; ELSE WriteOther; END;
WHEN 语句求值表达式一次,然后把它与每个测试值比较。表达式必须是简单数据类型整数或字符串。
注释:当使用字符串时,WHEN 不区分大小写。
用户也可使用此例所示的逗号分隔的格式,指定多个测试值:
WHEN i*j IS 1,2,3 DO WriteOne; ELSWHEN 4,5,6 DO WriteTwo; ELSWHEN 7,8,9 DO WriteThree; ELSE WriteOther; END;
FOR 循环结构用来把一个或多个语句执行事先确定的次数。FOR 结构的形式如下:
FOR <循环参数>:=<下界> TO <上界> DO <语句列表> END;
此形式的要素如下表所示。
要素 | 说明 |
<循环参数> | 整数变量,把它赋值为<下界>和<上界>之间的值(包括界值) |
<下界> | 整型表达式,在循环开始时求值一次,并把它赋值给<循环参数> |
<上界> | 整型表达式,在循环开始时求值一次,每次执行一次循环把它和<循环参数>值比较 |
<语句列表> | 一个或多个开发工具包语句,对<下界>和<上界>之间(包括界值)的每个<循环参数>执行该语句 |
下列实例显示 FOR 语句的最简单使用方法。在此实例中,把字符串写到显示器 10 次。在语句列表内,不使用 i 变量的值。
FOR i:=1 TO 10 DO WinWriteLN(myWindow,'Hello'); END;
下列实例稍微复杂一些。
FOR i:=j TO k*3 DO WinWriteLN(myWindow,'i = ' & i); END;
注释:如果下界等于上界,执行语句列表一次。如果下界大于上界,根本不执行语句列表。
如下例所示,为了从高值到低值循环,可用关键字 DOWNTO 取代 TO:
FOR i:=10 DOWNTO 1 DO WinWriteLN(myWindow,i); END;
FOR 语句有另一种形式,用于类型为列表的变量:
FOR <列表参数> DO <语句列表> END;
这里,对列表参数中的每个值执行一次语句列表。把列表参数的当前元素指针($Current)初始化为指向列表中的第一个元素。在语句列表执行终止时,元素指针向前移动。这使得对列表中的每个元素执行一个或多个语句。
考虑下列实例:
ListInsert(myList,'One'); ListInsert(myList,'Two'); ListInsert(myList,'Three'); FOR myList DO WinWriteLN(myWindow,myList[$Current]); END;
REPEAT 循环结构一次执行一组语句,然后继续执行这些语句,直到一定的条件成为真。
REPEAT 循环结构的形式如下:
REPEAT <语句列表> UNTIL <条件>;
下列代码把字符串'Hello'写到屏幕 10 次:
i:=1; REPEAT WinWriteLN(myWindow,'Hello'); i:=i + 1; UNTIL i > 10;
在前面的实例中,<条件>是布尔表达式,每执行一次循环对它求值一次。如果它求值为假,再执行<语句列表>中的语句。
布尔表达式可包括由下列项连接的子句:
子句包括两个兼容数据类型的表达式,中间由关系运算符(=、>、<等等)分隔。
WHILE 循环结构与 REPEAT 循环结构类似,差别在于它只是在循环开始时测试出口条件,而不是在循环终止时测试。REPEAT 循环结构中的语句保证至少执行一次,而如果初始时循环条件为假,WHILE 循环结构中的语句根本不执行。
WHILE 循环结构的形式如下:
WHILE <条件> DO <语句列表> END;
下列程序是把字符串'Hello'写到屏幕 10 次:
i:=1; WHILE i <= 10 DO WinWriteLN('Hello'); i:=i + 1; END;
Exit 语句可用来从函数或过程调用中退出。当使用它时,即使把它放在 FOR、REPEAT 或 WHILE 循环中,它使当前例程完全停止。
如同它的名称所暗示的,在循环终止条件成为真之前,ExitLoop 语句可用来退出循环。
在下列实例中,建立循环以从 EMPLOYEES 数据库表中读取并打印每一行。如果 SQLFetch 语句失败,返回一个小于 1 的值(因此指示出现错误或达到设置的结果终止),ExitLoop 语句使循环停止执行。执行紧跟在循环后的下一个语句。
下列实例显示 ExitLoop 的使用。
VARIABLES i: Integer; cursor: SQLCursor; employee: EmployeeRecord; ACTIONS i:=SQLSelect(cursor,'SELECT * FROM EMPLOYEES'); WHILE i > 0 DO i:=SQLFetch(cursor,employee); IF i < 1 THEN ExitLoop; END; PrintEmployee(employee); END; SQLCloseCursor(cursor);
Tivoli 服务台 6.0 开发工具包脚本程序设计指南