這會使問題過於寬泛,無法處理所有事情,因此堅持以INSPECT
和PERFORM
爲例。
WORKING-STORAGE SECTION.
01 THE-STRING PIC X(50).
01 A-HIGH-VALUE PIC X VALUE HIGH-VALUES.
01 A-SPACE PIC X VALUE SPACE.
PROCEDURE DIVISION.
INSPECT THE-STRING
REPLACING ALL SPACE
BY HIGH-VALUE
INSPECT THE-STRING
CONVERTING ' '
TO X'FF'
INSPECT THE-STRING
CONVERTING HIGH-VALUE
TO HIGH-VALUE
INSPECT THE-STRING
REPLACING ALL A-HIGH-VALUE
BY A-HIGH-VALUE
INSPECT THE-STRING
CONVERTING A-HIGH-VALUE
TO A-HIGH-VALUE
GOBACK
.
INSPECT有多種格式。以上包括兩種格式,並使用文字,圖形常量和數據名稱。所有的INSPECT產生相同的結果。生成的代碼...
000010 INSPECT
000544 DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000011 INSPECT
00054A DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000012 INSPECT
000550 DC31 8000 A12C TR 0(50,8),300(10) THE-STRING PGMLIT AT +292
000013 INSPECT
000556 D2FF D100 A02C MVC 256(256,13),44(10) TS2=0 PGMLIT AT +36
00055C 41E0 D100 LA 14,256(0,13) TS2=0
000560 1BFF SR 15,15
000562 BFF1 8038 ICM 15,1,56(8) A-HIGH-VALUE
000566 1AFE AR 15,14
000568 D200 F000 8040 MVC 0(1,15),64(8) A-SPACE
00056E DC31 8000 D100 TR 0(50,8),256(13) THE-STRING TS2=0
000014 INSPECT
000574 5820 905C L 2,92(0,9) TGTFIXD+92
000578 58F0 2044 L 15,68(0,2) V(IGZCIN1)
00057C 4110 A296 LA 1,662(0,10) PGMLIT AT +654
000580 0DEF BASR 14,15
可以看出,前三個例子(如編譯器知道的值被改變,他們將被改變)都產生一個簡單的TR,翻譯,指令就性能而言,這絕對會讓你在COBOL中可以編碼的任何東西都變得面目全非。
第四個做一些工作(每次)爲TR設置。第五個建立參數到運行時間例程(IGZCIN1),然後讓該rip。
所有這些都會擊敗你的循環。隨着該領域的規模擴大。
當然,如果你的領域很短,你有機會用簡單的IFs獲勝。
TR很快,但確實需要一個256字節的轉換表。
大多數INSPECT是非常迅速的,和所有的動詞一樣,本質上知道所有事物的長度,所以沒有機會爲你自己編寫一個「再見」。
有些網站愚蠢地「禁止」通過錯誤思維(或簡單地說,不思考)使用INSPECT。 TALLYING所有字符可以被認爲是緩慢的,但爲什麼要使用它?
現在,你的表演。如果你想成爲高效,同時通過一些循環來看待每一個字節,不那樣做:-)
PERFORM VARYING SUB1
FROM 1 BY 1
UNTIL SUB1 > 10
IF VARA(SUB1:1) = SPACE
MOVE HIGH-VALUE TO VARA(SUB1:1)
END-IF
END-PERFORM
你有「VARYING」,但什麼變化?您正在查看10個字節。沒有什麼變化。哦,當然,它看起來更像是「代碼」(來自其他語言),並且可以節省大量的輸入。付費,每天付費:-)
MOVE ZERO TO SUB1
PERFORM LENGTH OF VARA TIMES
ADD 1 TO SUB1
IF VARA (SUB1 : 1) = SPACE
MOVE HIGH-VALUE TO VARA (SUB1 : 1)
END-IF
END-PERFORM
(我還沒有做完整的格式,因爲VARA是在那裏,並參考修改...)
然後,假設您必須測試超過一個字節的內容,並決定使用帶有INDEXED BY的OCCURS,因爲它「更高效」。然而,使用文字,甚至是長文字,都會讓你自己產生曲折的代碼。這是因爲編譯器在將索引與文字進行比較時必須「對索引進行」歸一化處理,所以必須將其從位移轉換爲用於比較的條目編號。你通過使用INDEXED BY獲得了什麼,因爲鬆懈和使用VARYING而鬆動(可能是所有的,甚至更多)。爲了獲得更多普遍的感覺,不僅需要幾種INSPECT格式的類型,還需要生成「僞彙編器」,瞭解它在做什麼(至少在一般意義上)以及然後運行一些存根程序並實際比較所消耗的資源,然後鍵入以說明消耗的差異。
它不會一次全部到來,它是一個持續的過程,然後,當您到達Enterprise COBOL V5 +時,它會重新開始,因爲一切都被更改:-)