- Rexx 教程
- Rexx - 首頁
- Rexx - 概述
- Rexx - 環境
- Rexx - 安裝
- Rexx - 外掛安裝
- Rexx - 基本語法
- Rexx - 資料型別
- Rexx - 變數
- Rexx - 運算子
- Rexx - 陣列
- Rexx - 迴圈
- Rexx - 決策
- Rexx - 數字
- Rexx - 字串
- Rexx - 函式
- Rexx - 棧
- Rexx - 檔案I/O
- Rexx - 檔案函式
- Rexx - 子程式
- Rexx - 內建函式
- Rexx - 系統命令
- Rexx - XML
- Rexx - Regina
- Rexx - 解析
- Rexx - 訊號
- Rexx - 除錯
- Rexx - 錯誤處理
- Rexx - 面向物件
- Rexx - 可移植性
- Rexx - 擴充套件函式
- Rexx - 指令
- Rexx - 實現
- Rexx - Netrexx
- Rexx - Brexx
- Rexx - 資料庫
- 手持式和嵌入式
- Rexx - 效能
- Rexx - 最佳程式設計實踐
- Rexx - 圖形使用者介面
- Rexx - Reginald
- Rexx - Web程式設計
- Rexx 有用資源
- Rexx 快速指南
- Rexx - 有用資源
- Rexx - 討論
Rexx 快速指南
Rexx - 概述
Rexx (Restructured Extended Executor) 旨在成為一種指令碼語言。其目標是使指令碼編寫儘可能簡單、快速、可靠和無錯誤。許多程式語言的設計是為了與舊語言相容,併為特定受眾或平臺編寫。Rexx 忽略了無關的目標。它從一開始就被設計成功能強大且易於使用。
Rexx 由 IBM 的 Mike Cowlishaw 於 1979 年 3 月 20 日至 1982 年年中設計並首次使用匯編語言實現,最初作為一個指令碼程式語言來替代EXEC 和 EXEC 2語言。它被設計為任何系統的宏或指令碼語言。因此,Rexx 被認為是 Tcl 和 Python 的前身。Rexx 的建立者還旨在使其成為 PL/I 程式語言的簡化和易於學習的版本。
Rexx 的特性
作為一種程式語言,Rexx 具有以下關鍵特性:
簡單的語法
能夠將命令路由到多個環境
能夠支援與特定呼叫環境相關的函式、過程和命令。
內建棧,能夠與主機棧(如果存在)互操作。
包含只有幾十條指令的小型指令集
自由格式語法
不區分大小寫的標記,包括變數名
基於字串
動態資料型別,無需宣告
沒有保留關鍵字,除非在區域性上下文中
沒有包含檔案功能
任意數值精度
十進位制算術,浮點數
豐富的內建函式選擇,特別是字串和單詞處理
自動儲存管理
崩潰保護
內容可定址資料結構
關聯陣列
直接訪問系統命令和功能
簡單的錯誤處理以及內建跟蹤和偵錯程式
很少的人為限制
簡化的 I/O 功能
Rexx 的官方網站是 www.oorexx.org
Rexx - 環境
在開始使用 Rexx 之前,您需要確保您的系統上執行著一個功能齊全的 Rexx 版本。本章將解釋在 Windows 機器上安裝 Rexx 及其後續配置,以便開始使用 Rexx。
在繼續安裝之前,請確保滿足以下系統要求。
系統要求
| 記憶體 | 2 GB RAM(推薦) |
| 磁碟空間 | 沒有最低要求。最好有足夠的儲存空間來儲存將使用 Rexx 建立的程式。 |
| 作業系統版本 | Rexx 可以安裝在 Windows、Ubuntu/Debian、Mac OS X 上。 |
下載 Rexx
要下載 Rexx,您應該使用以下 URL:https://www.oorexx.org/download.html
此頁面提供了各種 Rexx 版本的各種下載,如下面的螢幕截圖所示。
單擊標題為 Release 4.2.0 的表中的“ooRexx 安裝檔案”。
之後,您將被重定向到以下頁面。
單擊ooRexx-4.2.0.windows.x86_64.exe 下載軟體的64 位版本。我們將在下一章討論有關軟體安裝的內容。
Rexx - 安裝
以下步驟將詳細解釋如何在 Windows 系統上安裝 Rexx。
步驟 1 - 啟動在上一節下載的安裝程式。安裝程式啟動後,單擊“執行”按鈕。
步驟 2 - 單擊以下螢幕上的“下一步”按鈕以繼續安裝。
步驟 3 - 單擊“我同意”按鈕繼續。
步驟 4 - 接受預設元件,然後單擊“下一步”按鈕。
步驟 5 - 選擇安裝位置,然後單擊“下一步”按鈕。
步驟 6 - 接受將安裝的預設程序,然後單擊“下一步”按鈕。
步驟 7 - 選擇預設檔案關聯,然後單擊“下一步”按鈕。
步驟 8 - 單擊將 Rexx 專案傳送到可執行檔案的複選框,然後單擊“下一步”按鈕,如下面的螢幕截圖所示。
步驟 9 - 在下一個螢幕中,選擇用於處理 Rexx 檔案的編輯器。將記事本保留為預設選項。還接受每個 Rexx 檔案的預設副檔名。
步驟 10 - 接受出現的下一個螢幕上的預設設定,然後單擊“下一步”按鈕以繼續安裝。
步驟 11 - 最後,單擊“安裝”按鈕以繼續安裝。
步驟 12 - 安裝完成後,您需要單擊“下一步”按鈕以繼續。
步驟 13 - 單擊“完成”按鈕以完成安裝。
Rexx - 外掛安裝
在本章中,我們將討論如何在流行的 IDE(整合開發環境)中安裝外掛。Rexx 作為一種程式語言,也適用於流行的 IDE,例如Eclipse。讓我們看看如何在這些 IDE 中獲取所需的外掛,以便您在使用 Rexx 時有更多選擇。
在 Eclipse 中安裝
要在 Eclipse 中順利安裝 Rexx,您需要遵守以下步驟。
步驟 1 - 開啟 Eclipse 並單擊選單項幫助→Eclipse 市場,如下面的螢幕截圖所示。
步驟 2 - 在下一個對話方塊中,在搜尋條件中輸入 Rexx,然後單擊搜尋按鈕。
完成後,單擊“安裝”按鈕。
步驟 3 - 單擊“確認”按鈕以繼續進行功能安裝。
步驟 4 - Eclipse 然後將下載必要的文 件以開始安裝。完成後,Eclipse 將要求接受許可協議。單擊接受許可協議,然後單擊“完成”按鈕,如下面的螢幕截圖所示。
Eclipse 然後將在後臺開始安裝軟體。
步驟 5 - 您可能會收到安全警告(如下面的螢幕截圖所示)。單擊“確定”按鈕繼續。
步驟 6 - 安裝更新後,系統將提示您重新啟動 Eclipse。單擊“是”以重新啟動 Eclipse。
Rexx - 基本語法
為了理解 Rexx 的基本語法,讓我們首先來看一個簡單的 Hello World 程式。
示例
/* Main program */ say "Hello World"
可以看出 Hello World 程式有多簡單。它是一個簡單的指令碼行,用於執行 Hello World 程式。
關於上述程式,需要注意以下幾點:
say 命令用於將值輸出到控制檯。
/* */ 用於 Rexx 中的註釋。
上述程式的輸出將是:
Hello World
語句的一般形式
在 Rexx 中,讓我們看看程式的一般形式。請看下面的例子。
/* Main program */ say add(5,6) exit add: parse arg a,b return a + b
上述程式的輸出將是:
11
讓我們回顧一下我們從上述程式中瞭解到的內容:
Add 是一個定義為將兩個數字相加的函式。
在主程式中,5 和 6 的值用作 add 函式的引數。
exit 關鍵字用於退出主程式。這用於區分主程式和 add 函式。
add 函式用“:”符號區分。
parse 語句用於解析傳入的引數。
最後,return 語句用於返回數值之和。
子程式和函式
在 Rexx 中,程式碼通常分為子程式和函式。子程式和函式用於將程式碼劃分為不同的邏輯單元。子程式和函式之間的關鍵區別在於,函式返回值而子程式不返回值。
下面是子程式和函式在加法實現方面的關鍵區別示例:
函式實現
/* Main program */ say add(5,6) exit add: parse arg a,b return a + b
子程式實現
/* Main program */ add(5,6) exit add: parse arg a,b say a + b
兩個程式的輸出值都將是 11。
執行命令
Rexx 可用作各種基於命令的系統的控制語言。Rexx 在這些系統中執行命令的方式如下。當 Rexx 遇到既不是指令也不是賦值的程式行時,它會將該行視為要計算然後傳遞給環境的字串表示式。
例如:
示例
/* Main program */ parse arg command command "file1" command "file2" command "file3" exit
此程式中的三行類似的行都是字串表示式,它將檔名(包含在字串常量中)新增到命令名(作為引數給出)。生成的字串將傳遞給環境以作為命令執行。命令完成後,“rc”變數將設定為命令的退出程式碼。
上述程式的輸出如下:
sh: file1: command not found
3 *-* command "file1"
>>> " file1"
+++ "RC(127)"
sh: file2: command not found
4 *-* command "file2"
>>> " file2"
+++ "RC(127)"
sh: file3: command not found
5 *-* command "file3"
>>> " file3"
+++ "RC(127)"
Rexx 中的關鍵字
REXX 的自由語法意味著某些符號在特定上下文中保留供語言處理器使用。
在特定指令中,某些符號可能被保留用於分隔指令的各個部分。這些符號被稱為關鍵字。REXX 關鍵字的示例包括**DO 指令中的 WHILE**,以及**IF 或 WHEN 子句**後面的**THEN**(在這種情況下充當子句終止符)。
除了這些情況外,只檢查那些作為子句中第一個標記且後跟“=”或“:”以外的簡單符號,以檢視它們是否為指令關鍵字。您可以在子句中的其他地方自由使用這些符號,而不會將其視為關鍵字。
REXX 中的註釋
註釋用於為程式碼新增文件。單行註釋透過在該行的任何位置使用 /* */ 來標識。
例如:
/* Main program */ /* Call the add function */ add(5,6) /* Exit the main program */ exit add: /* Parse the arguments passed to the add function */ parse arg a,b /* Display the added numeric values */ say a + b
註釋也可以寫在程式碼行之間,如下面的程式所示:
/* Main program */ /* Call the add function */ add(5,6) /* Exit the main program */ exit add: parse /* Parse the arguments passed to the add function */ arg a,b /* Display the added numeric values */ say a + b
上述程式的輸出將是:
11
您也可以在註釋中包含多行,如下面的程式所示:
/* Main program The below program is used to add numbers Call the add function */ add(5,6) exit add: parse arg a,b say a + b
上述程式的輸出將是:
11
REXX - 資料型別
在任何程式語言中,您都需要使用各種變數來儲存各種型別的資訊。變數只不過是保留的記憶體位置,用於儲存值。這意味著當您建立變數時,您會在記憶體中保留一些空間來儲存與該變數關聯的值。
您可能希望儲存各種資料型別的資訊,例如字串、字元、寬字元、整數、浮點數、布林值等。根據變數的資料型別,作業系統將分配記憶體並決定可以在保留的記憶體中儲存什麼。
內建資料型別
REXX 提供了各種內建資料型別。以下是REXX中定義的資料型別列表。
**整數** - 不包含小數點或指數識別符號的數字字串。第一個字元可以是**加號 (+) 或減號 (-)**。表示的數字必須介於 -2147483648 和 2147483647(含)之間。
**大整數** - 不包含小數點或指數識別符號的數字字串。第一個字元可以是加號 (+) 或減號 (-)。表示的數字必須介於 -9223372036854775808 和 2147483648(含)之間,或介於 2147483648 和 9223372036854775807 之間。
**十進位制** - 將採用以下格式之一:
包含小數點但不包含指數識別符號的數字字串。**p** 代表精度,**s** 代表字串表示的十進位制數的標度。第一個字元可以是加號 (+) 或減號 (-)。
不包含小數點或指數識別符號的數字字串。第一個字元可以是加號 (+) 或減號 (-)。表示的數字小於 -9223372036854775808 或大於 9223372036854775807。
**浮點數** - 以科學計數法表示數字的字串。該字串由一系列數字後跟指數識別符號(E 或 e 後跟可選的加號 (+) 或減號 (-) 和一系列數字)組成。該字串可以以加號 (+) 或減號 (-) 開頭。
**字串** - 普通字元字串。
以下是每種資料型別使用方法的一些示例。每種資料型別將在後續章節中詳細討論。這只是為了讓您快速瞭解上述資料型別的簡要說明。
整數
下面的程式顯示瞭如何使用數字資料型別。此程式顯示了兩個整數的加法。
示例
/* Main program The below program is used to add numbers Call the add function */ add(5,6) exit add: parse arg a,b say a + b
上述程式的輸出將是:
11
大整數
下面的程式顯示了 REXX 處理大整數的能力。此程式顯示瞭如何新增兩個大整數。
示例
/* Main program The below program is used to add numbers Call the add function */ add(500000000000,6000000000000000000000) exit add: parse arg a,b say a + b
上述程式的輸出將是:
6.00000000E+21
十進位制
下面的程式顯示了 REXX 處理十進位制數的能力。此程式顯示瞭如何新增兩個十進位制數。
示例
/* Main program The below program is used to add numbers Call the add function */ add(5.5,6.6) exit add: parse arg a,b say a + b
上述程式的輸出將是:
12.1
浮點數
以下示例展示了數字如何作為浮點數工作。
示例
/* Main program The below program is used to add numbers Call the add function */ add(12E2,14E4) exit add: parse arg a,b say a + b
上述程式的輸出將是:
141200
字串
下面的程式顯示瞭如何使用元組資料型別。
在這裡,我們定義了一個包含 3 個元素的**元組 P**。**tuple_size** 是 REXX 中定義的內建函式,可用於確定元組的大小。
示例
/* Main program */
display("hello")
exit
display:
parse arg a
say a
上述程式的輸出將是:
hello
Rexx - 變數
在 REXX 中,所有變數都使用“=”語句繫結。變數名有時也稱為符號。它們可以由字母、數字和字元(例如“**. ! ? _**”)組成。您建立的變數名不能以數字或句點開頭。簡單的變數名不包含句點。包含句點的變數名稱為複合變數,表示陣列或表。
以下是 REXX 中的基本變數型別,在上一章中也有解釋:
**整數** - 用於表示整數或浮點數。例如 10。
**大整數** - 表示較大的整數值。
**十進位制** - 十進位制值是包含小數點但不包含指數識別符號的數字字串。
**浮點數** - 浮點值是以科學計數法表示數字的字串。
**字串** - 一系列字元定義了 REXX 中的字串。
不同型別的變數函式
在本節中,我們將討論變數可以執行的各種函式。
變數宣告
定義變數的通用語法如下所示:
var-name = var-value
其中
**var-name** - 這是變數的名稱。
**var-value** - 這是繫結到變數的值。
下面的程式是變數宣告的示例:
示例
/* Main program */ X = 40 Y = 50 Result = X + Y say Result
在上面的示例中,我們有兩個變數,一個是繫結到值**40**的**X**,另一個是繫結到值**50**的**Y**。另一個名為 Result 的變數繫結到**X 和 Y**的和。
上述程式的輸出如下:
90
變數命名
變數名有時也稱為符號。它們可以由字母、數字和字元(例如“. ! ? _”)組成。您建立的變數名不能以數字或句點開頭。
如果尚未為變數賦值,則將其稱為未初始化變數。未初始化變數的值是變數本身的大寫字母名稱。
未賦值變數的示例如下:
示例
/* Main program */ unassignedvalue say unassignedvalue
如果執行上面的程式,您將得到以下輸出:
UNASSIGNEDVALUE
sh: UNASSIGNEDVALUE: command not found
2 *-* unassignedvalue
>>> "UNASSIGNEDVALUE"
+++ "RC(127)"
變數可以多次賦值。下面的程式顯示瞭如何多次為 X 賦值。
示例
/* Main program */ X = 40 X = 50 say X
上述程式的輸出如下:
50
列印變數
使用**say**命令列印變數的值。以下是列印多個變數的示例。
示例
/* Main program */ X = 40 /* Display an Integer */ say X Y = 50.5 /* Display a Float */ say Y Z = "hello" /* Display a string */ say Z
上述程式的輸出如下:
40 50.5 hello
Rexx - 運算子
運算子是一個符號,它告訴編譯器執行特定的數學或邏輯操作。
REXX 有各種型別的運算子,也詳細解釋如下:
- 算術運算子
- 關係運算符
- 邏輯運算子
- 位運算子
算術運算子
REXX 語言支援與任何語言相同的普通算術運算子。以下是 REXX 中可用的算術運算子。
| 運算子 | 描述 | 示例 |
|---|---|---|
| + | 兩個運算元的加法 | 1 + 2 將得到 3 |
| - | 從第一個運算元中減去第二個運算元 | 1 - 2 將得到 -1 |
| ∗ | 兩個運算元的乘法 | 2 ∗ 2 將得到 4 |
| / | 分子除以分母 | 2 / 2 將得到 1 |
| // | 將第一個數字除以第二個數字的餘數 | 3 // 2 將得到 1 |
| % | div 元件將執行除法並返回整陣列件。 | 3 % 2 將得到 1 |
關係運算符
關係運算符允許比較物件。以下是 REXX 中可用的關係運算符。在 REXX 中,真值用 1 表示,假值用 0 表示。
| 運算子 | 描述 | 示例 |
|---|---|---|
| == | 測試兩個物件之間的相等性 | 2 = 2 將得到 1 |
| < | 檢查左側物件是否小於右側運算元。 | 2 < 3 將得到 1 |
| =< | 檢查左側物件是否小於或等於右側運算元。 | 2 =< 3 將得到 1 |
| > | 檢查左側物件是否大於右側運算元。 | 3 > 2 將得到 1 |
| >= | 檢查左側物件是否大於或等於右側運算元。 | 3 > 2 將得到 1 |
邏輯運算子
邏輯運算子用於評估布林表示式。以下是 REXX 中可用的邏輯運算子。
| 運算子 | 描述 | 示例 |
|---|---|---|
| & | 這是邏輯“與”運算子 | 1 或 1 將得到 1 |
| | | 這是邏輯“或”運算子 | 1 或 0 將得到 1 |
| \ | 這是邏輯“非”運算子 | \0 將得到 1 |
| && | 這是邏輯異或運算子 | 1 && 0 將得到 1 |
位運算子
Groovy 提供四個位運算子。以下是 Groovy 中可用的位運算子。
| 序號 | 運算子和描述 |
|---|---|
| 1 | bitand 這是按位“與”運算子 |
| 2 | bitor 這是按位“或”運算子 |
| 3 | bitxor 這是按位“異或”或“或非”運算子 |
運算子優先順序
下表按 REXX 運算子的優先順序遞減順序顯示運算子優先順序。
| 運算子 | 優先順序 |
|---|---|
| 字首運算子 | + - \ |
| 加法和減法 | + - |
| 比較運算子 | = == > < >= <= |
| 邏輯與 | & |
| 邏輯或 | | |
| 異或 | && |
Rexx - 陣列
在任何程式語言中,陣列都允許您對同一型別的值的列表進行分組。使用陣列的好處是它允許您構建一個類似型別值的列表,這些值是**可排序的、可搜尋的**,並且可以**輕鬆操作**。REXX 也允許定義陣列。這些陣列可以是一維的或多維的。
REXX 陣列可能是稀疏的。也就是說,並非每個陣列位置都必須有值,甚至不必初始化。在包含資料元素的那些元素之間,可能存在空的陣列位置或槽。或者陣列可以是密集的,其中連續的陣列槽都包含資料元素。
在許多程式語言中,您必須關心表中第一個條目的下標是什麼。第一個數字下標是 0 還是 1?在 REXX 中,第一個下標是您使用的任何值!因此,根據您的喜好,將第一個陣列元素輸入到位置 0 或 1。
array_name.0 = ‘first element’
或
array_name.1 = ‘first element’
讓我們看看陣列可用的不同操作。
建立陣列
陣列的建立使用與 REXX 中變數相同的命名約定。
建立陣列的通用語法如下:
Arrayname.index = value
其中
**Arrayname** - 這是為陣列提供的名稱。
**Index** - 這是陣列中的索引位置,用於引用特定元素。
**Value** - 這是分配給陣列中索引元素的值。
陣列宣告的示例如下:
示例
/* Main program */ list.1 = 0 list.2 = 0 list.3 = 0
關於上述程式,需要注意以下幾點:
- 陣列的名稱為 list
- 陣列有 3 個元素,其值初始化為 0。
為陣列元素賦值
可以像初始化陣列元素一樣重新為陣列元素賦值。
下面的程式是一個示例,它可以為現有陣列的各種索引值賦值。
/* Main program */ list.1 = 0 list.2 = 0 list.3 = 0 /* Assigning new values to the array*/ list.1 = 10 list.3 = 30
顯示陣列的值
可以透過引用陣列元素的索引位置來顯示陣列的值。以下示例演示如何訪問陣列的各種元素。
示例
/* Main program */ list.1 = 0 list.2 = 0 list.3 = 0 /* Assigning new values to the array*/ list.1 = 10 list.3 = 30 say list.1 say list.2 say list.3
上述程式的輸出如下:
10 0 30
複製陣列
可以將陣列的所有元素複製到另一個數組中。其一般語法如下:
Newarray. = sourcearray.
其中
Newarray − 這是需要將元素複製到的新陣列。
Sourcearray − 這是需要從中複製元素的源陣列。
以下程式顯示瞭如何執行陣列的複製操作:
示例
/* Main program */ list.1 = 0 list.2 = 0 list.3 = 0 /* Assigning new values to the array*/ list.1 = 10 list.3 = 30 listnew. = list. say listnew.1 say listnew.2 say listnew.3
上述程式的輸出將是:
10 0 30
迭代陣列元素
也可以使用 Rexx 中提供的迭代語句來迭代陣列元素。以下是執行此操作的示例:
示例
/* Main program */ list.1 = 10 list.2 = 20 list.3 = 30 number_of_elements = 3 do j = 1 to number_of_elements say list.j end
關於上述程式,需要注意以下幾點:
do 迴圈用於迭代陣列元素。
變數number_of_elements用於儲存陣列中元素的數量。
變數j用於迭代陣列的每個元素。
上述程式的輸出將是:
10 20 30
二維陣列
前面也提到過,我們可以在 Rexx 中構建多維陣列。讓我們來看一個如何實現二維陣列的示例。
示例
/* Main program */ list.1 = 10 list.1.1 = 11 list.1.2 = 12 say list.1 say list.1.1 say list.1.2
上述程式的輸出將顯示如下:
10 11 12
關於上述程式,需要注意以下幾點:
要建立多維陣列,可以使用另一層索引。因此,在我們的示例中,我們使用list.1.1為 list 陣列的索引值 1 建立另一個內部陣列。
Rexx - 迴圈
到目前為止,我們已經看到了按順序依次執行的語句。此外,Rexx 中還提供了用於更改程式邏輯控制流的語句。然後,它們被分類為控制流語句,我們將詳細研究這些語句。
迴圈語句允許我們多次執行一條語句或一組語句。以下圖示是大多數程式語言中迴圈語句的一般形式。
讓我們討論 Rexx 支援的各種迴圈。
| 序號 | 迴圈型別和說明 |
|---|---|
| 1 | do 迴圈
do 迴圈用於執行一定次數的若干條語句。語句需要執行的次數由傳遞給 do 迴圈的值確定。 |
| 2 | do-while 迴圈
do-while 語句用於模擬其他程式語言中存在的簡單 while 迴圈。 |
| 3 | do-until 迴圈
do-until 迴圈是 do while 迴圈的一個輕微變體。此迴圈的不同之處在於,當被評估的條件為假時,它將退出。 |
受控重複
do 迴圈可以用於執行語句的受控重複。
語法
此類語句的一般語法如下。
do index = start [to limit] [by increment] [for count] statement #1 statement #2 end
此語句的不同之處在於,有一個索引用於控制迴圈執行的次數。其次,有一些引數說明索引應從哪個值開始,應在哪裡結束以及增量值是多少。
流程圖
讓我們來看看這個迴圈的流程圖:
從上圖可以清楚地看到,迴圈是根據索引值以及如何遞增索引值來執行的。
以下程式是受控重複語句的示例。
示例
/* Main program */ do i = 0 to 5 by 2 say "hello" end
在上例程式中,count i的值首先設定為 0。然後以 2 為增量遞增,直到值不大於 5。
上述程式碼的輸出將是:
hello hello hello
Rexx - 決策
決策結構要求程式設計師指定一個或多個條件供程式評估或測試。
下圖顯示了大多數程式語言中典型的決策結構的一般形式。
如果條件確定為true,則執行一條或多條語句;如果條件確定為false,則可以選擇執行其他語句。
讓我們看看 Rexx 中可用的各種決策語句。
| 序號 | 語句和說明 |
|---|---|
| 1 | if 語句
第一個決策語句是if語句。if語句由一個布林表示式和一個或多個語句組成。 |
| 2 | if-else 語句
下一個決策語句是 if-else 語句。if語句後面可以跟一個可選的 else 語句,當布林表示式為假時,將執行該語句。 |
巢狀 if 語句
有時需要在彼此內部巢狀多個 if 語句,這在其他程式語言中也是可能的。在 Rexx 中,這也是可能的。
語法
if (condition1) then
do
#statement1
end
else
if (condition2) then
do
#statement2
end
流程圖
巢狀if語句的流程圖如下:
讓我們來看一個巢狀if語句的示例:
示例
/* Main program */
i = 50
if (i < 10) then
do
say "i is less than 10"
end
else
if (i < 7) then
do
say "i is less than 7"
end
else
do
say "i is greater than 10"
end
上述程式的輸出將是:
i is greater than 10
select 語句
Rexx 提供了 select 語句,可用於根據 select 語句的輸出執行表示式。
語法
此語句的一般形式為:
select when (condition#1) then statement#1 when (condition#2) then statement#2 otherwise defaultstatement end
此語句的一般工作原理如下:
select 語句有一系列 when 語句來評估不同的條件。
每個when 子句都有一個不同的條件需要評估,然後執行後續語句。
如果前面的 when 條件不評估為 true,則使用 otherwise 語句執行任何預設語句。
流程圖
select語句的流程圖如下
以下程式是 Rexx 中 case 語句的示例。
示例
/* Main program */ i = 50 select when(i <= 5) then say "i is less than 5" when(i <= 10) then say "i is less than 10" otherwise say "i is greater than 10" end
上述程式的輸出將是:
i is greater than 10
Rexx - 數字
在數字方面,Rexx 具有以下資料型別。
整數− 不包含小數點或指數識別符號的數字字串。第一個字元可以是加號 (+) 或減號 (-)。表示的數字必須介於 -2147483648 和 2147483647(含)之間。
**大整數** - 不包含小數點或指數識別符號的數字字串。第一個字元可以是加號 (+) 或減號 (-)。表示的數字必須介於 -9223372036854775808 和 2147483648(含)之間,或介於 2147483648 和 9223372036854775807 之間。
十進位制− 以下格式之一:
包含小數點但不包含指數識別符號的數字字串,其中p表示精度,s表示字串表示的十進位制數的規模。第一個字元可以是加號 (+) 或減號 (-)。
不包含小數點或指數識別符號的數字字串。第一個字元可以是加號 (+) 或減號 (-)。表示的數字小於 -9223372036854775808 或大於 9223372036854775807。
**浮點數** - 以科學計數法表示數字的字串。該字串由一系列數字後跟指數識別符號(E 或 e 後跟可選的加號 (+) 或減號 (-) 和一系列數字)組成。該字串可以以加號 (+) 或減號 (-) 開頭。
現在讓我們看看可用於數字的不同方法。
| 序號 | 可用於數字的方法 |
|---|---|
| 1 | ABS
此方法返回輸入數字的絕對值。 |
| 2 | MAX
此方法從數字列表中返回最大值。 |
| 3 | MIN
此方法從數字列表中返回最小值。 |
| 4 | RANDOM
此方法返回一個隨機生成的數字。 |
| 5 | SIGN
如果數字大於 0,則返回 1;如果數字為 0,則返回 0;如果數字小於 0,則返回 -1。 |
| 6 | TRUNC
此方法截斷數字。 |
Rexx - 字串
Rexx 中的字串由一系列字元表示。以下程式是字串的示例:
/* Main program */ a = "This is a string" say a
上述程式的輸出如下:
This is a string
讓我們討論一些 Rexx 中可用於字串的方法。
| 序號 | Rexx 中可用於字串的方法 |
|---|---|
| 1 | left
此方法返回字串左側的特定數量的字元。 |
| 2 | right
此方法返回字串右側的特定數量的字元。 |
| 3 | length
此方法返回字串中的字元數。 |
| 4 | reverse
此方法以反向格式返回字元。 |
| 5 | compare
此方法比較兩個字串。如果“string1”和“string2”相同,則返回“0”。否則,返回第一個不匹配字元的位置。 |
| 6 | copies
此方法複製string n次。 |
| 7 | substr
此方法從特定字串中獲取子字串。 |
| 8 | pos
此方法返回一個字串在另一個字串中的位置。 |
| 9 | delstr
此方法刪除字串中的子字串。 |
Rexx - 函式
Rexx 中的程式碼通常分為函式和子程式。使用函式有助於將程式碼細分為更多邏輯單元。讓我們詳細瞭解這些函式。
定義函式
函式宣告的語法如下:
FunctionName: PARSE ARG arguement1, arguement2… arguementN Return value
其中:
FunctionName − 這是分配給函式的名稱。
PARSE ARG − 這些是 Rexx 中的關鍵字,用於表示引數正在傳遞給函式。
arguement1, arguement2… arguementN − 這些是傳遞給函式的引數。
返回值 − 這是函式返回的值。
以下程式是一個簡單的示例,說明如何在 Rexx 中使用函式。
/* Main program */ say add(5,6) exit add: PARSE ARG a,b return a + b
關於上述程式,需要注意以下幾點:
我們正在定義一個名為 add 的函式,它接受 2 個引數 a 和 b。
該函式使用 return 語句返回 a 和 b 的總和。
必須使用 exit 語句來表示主程式的結束。
上述程式的輸出將如下所示:
11
使用引數
在 Rexx 中,有一些特定函式可以與引數一起使用。讓我們來看幾個這樣的引數。
arg
此方法用於返回為函式定義的引數數量。
語法:
arg()
引數:無
返回值:此方法返回為函式定義的引數數量。
示例:
/* Main program */ say add(5,6) exit add: PARSE ARG a,b say arg() return a + b
輸出:執行上述程式時,我們將得到以下結果。
2 11
arg(index)
此方法用於返回特定位置的引數值。
語法:
arg(index)
引數:
索引:要返回的引數的索引位置。
返回值:此方法返回特定位置的引數值。
示例:
/* Main program */ say add(5,6) exit add: PARSE ARG a,b say arg(1) return a + b
輸出:執行上述程式時,我們將得到以下結果。
5 11
遞迴函式
遞迴函式或例程是呼叫自身的函式。任何遞迴函式都可以以傳統的非遞迴方式(或迭代方式)編寫程式碼,但有時遞迴會提供更好的問題解決方案。並非所有程式語言都支援遞迴;Rexx 支援。
讓我們來看一個使用 Rexx 中遞迴函式的著名階乘程式示例。
/* Main program */ do n = 1 to 5 say 'The factorial of' n 'is:' factorial( n ) end return /* Function to get factorial */ factorial : procedure n = arg(1) if n = 1 then return 1 return n * factorial( n - 1 )
上述程式的輸出如下:
The factorial of 1 is: 1 The factorial of 2 is: 2 The factorial of 3 is: 6 The factorial of 3 is: 24 The factorial of 3 is: 120
Rexx - 棧
棧有時被稱為外部資料佇列,但我們遵循常用用法,將其稱為棧。它是一塊邏輯上位於 Rexx 外部的記憶體塊。像 push 和 queue 這樣的指令將資料放入棧中,而像 pull 和 parse 這樣的指令則從中提取資料。queued 內建函式報告棧中包含多少項。
讓我們來看一個棧的例子。
/* STACK: */ /* */ /* This program shows how to use the Rexx Stack as either a */ /* stack or a queue. */ do j = 1 to 3 push ‘Stack: line #’ || j /* push 3 lines onto the stack */ end do j = 1 to queued() /* retrieve and display LIFO */ pull line say line end do j = 1 to 3 queue ‘Queue: line #’ || j /* queue 3 lines onto the stack */ end do queued() /* retrieve and display FIFO */ pull line say line end exit 0
程式中的第一個 do 迴圈將三行資料放入棧中。它使用 push 指令來完成此操作。我們對這些行進行編號,以便在 LIFO(後進先出)順序檢索它們時,它們的順序一目瞭然。
push 指令放入棧中的項將按 LIFO 順序檢索 -
do j = 1 to 3 push ‘Stack: line #’ || j /* push 3 lines onto the stack */ end
下一個程式碼塊顯示了使用 queued 內建函式來查詢棧中行數的方法,以及一個迴圈來從棧中檢索所有行 -
do j = 1 to queued() /* retrieve and display LIFO */ pull line say line end
由於這三個專案是透過 push 放入棧中的,因此它們以 LIFO 順序檢索。
上述程式的輸出如下。
STACK: LINE #3 STACK: LINE #2 STACK: LINE #1
Rexx - 檔案I/O
在處理 I/O 時,Rexx 提供多種方法。Rexx 提供更簡單的類來為檔案提供以下功能。
- 讀取檔案
- 寫入檔案
- 檢視檔案是檔案還是目錄
Rexx 中用於檔案 I/O 的函式基於行輸入和字元輸入,我們將詳細研究這兩種函式。
讓我們探索 Rexx 提供的一些檔案操作。出於這些示例的目的,我們將假設存在一個名為 **NewFile.txt** 的檔案,其中包含以下文字行:
Example1
Example2
Example3
此檔案將用於以下示例中的讀寫操作。在這裡,我們將討論如何以不同的方式讀取檔案的內容。
一次讀取一行檔案內容
對檔案的常規操作是透過使用 Rexx 庫本身中提供的方法來執行的。在 Rexx 中,讀取檔案是最簡單的操作之一。
讓我們看看用於完成此操作的函式。
linein
此方法從文字檔案中返回一行。文字檔案是作為函式輸入引數提供的檔名。
語法:
linein(filename)
引數:
**檔名** - 這是需要從中讀取行的檔名。
**返回值** - 此方法一次返回檔案的一行。
示例:
/* Main program */ line_str = linein(Example.txt) say line_str
上面的程式碼非常簡單,因為它將 **Example.txt** 檔名提供給 linein 函式。然後,此函式讀取一行文字並將結果提供給變數 **line_str**。
輸出:執行上述程式時,我們將得到以下結果。
Example1
一次讀取檔案的所有內容
在 Rexx 中,可以使用 while 語句讀取檔案的全部內容。while 語句將一行一行地讀取,直到到達檔案末尾。
下面顯示瞭如何實現此目標的示例。
/* Main program */ do while lines(Example.txt) > 0 line_str = linein(Example.txt) say line_str end
在上述程式中,需要注意以下幾點:
lines 函式讀取 **Example.txt** 檔案。
while 函式用於檢查 **Example.txt** 檔案中是否存在更多行。
對於從檔案中讀取的每一行,**line_str** 變數都儲存當前行的值。然後將其傳送到控制檯作為輸出。
輸出:執行上述程式時,我們將得到以下結果。
Example1 Example2 Example3
將內容寫入檔案
與讀取檔案一樣,Rexx 也能夠寫入檔案。讓我們看看用於完成此操作的函式。
lineout
此方法將一行寫入檔案。需要向其寫入行的檔案作為 lineout 語句的引數提供。
語法:
lineout(filename)
引數:
**檔名** - 這是需要向其寫入行的檔名。
**返回值** - 此方法返回 lineout 函式的狀態。如果成功寫入行,則返回的值為 0;否則,將返回 1。
示例:
/* Main program */ out = lineout(Example.txt,"Example4")
**輸出** - 每次執行上述程式碼時,都會將“Example4”寫入 **Example.txt** 檔案。
Rexx - 檔案函式
在本章中,我們將討論其他一些可用於檔案的函式。
| 序號 | 檔案函式 |
|---|---|
| 1 | Lines
此函式返回 1 或輸入流中剩餘的可讀取行數。檔名作為函式的輸入提供。 |
| 2 | stream
此函式用於檢查檔案的狀態。有時需要在使用檔案之前檢查其狀態。如果檔案已損壞或不可用,則無法對檔案執行任何進一步的操作。因此,首先檢查檔案的狀態更有意義。 |
| 3 | charin
此函式用於一次從檔案中讀取一個字元。有時程式需要逐字元讀取檔案,因此可以使用此函式。 |
| 4 | chars
此函式返回 1 或檔案中剩餘的可讀取字元數。檔名作為函式的引數提及。 |
| 5 | charout
此函式用於一次向檔案寫入一個字元。檔名作為函式的引數輸入。 |
Rexx - 子程式
在任何程式語言中,整個程式都分解成邏輯模組。這使得編寫易於維護的程式碼更加容易。這是任何程式語言的基本要求。
在 Rexx 中,可以使用子程式和函式編寫模組。讓我們詳細瞭解子程式。
定義子程式
函式宣告的語法如下:
FunctionName: Statement#1 Statement#2 …. Statement#N
其中:
**函式名** - 這是分配給子程式的名稱。
**語句#1 .. 語句#N** - 這些是構成子程式的語句列表。
下面的程式是一個簡單的示例,顯示了子程式的使用。
/* Main program */ call add exit add: a = 5 b = 10 c = a + b say c
關於上述程式,需要注意以下幾點:
我們正在定義一個名為 **add** 的子程式。
該子程式執行簡單的加法功能。
必須使用 exit 語句來表示主程式的結束。
上述程式的輸出將如下所示:
15
使用引數
也可以在 Rexx 中使用引數。以下示例顯示瞭如何實現此目標。
/* Main program */ call add 1,2 exit add: PARSE ARG a,b c = a + b say c
關於上述程式,需要注意以下幾點:
我們正在定義一個名為 add 的子程式,它接受 2 個引數。
在子程式中,使用 PARSE 和 ARG 關鍵字解析 2 個引數。
上述程式的輸出將如下所示:
3
引數的不同方法
讓我們看看其他一些可用於引數的方法。
arg
此方法用於返回為子程式定義的引數數量。
語法:
arg()
引數:無
**返回值** - 此方法返回為子程式定義的引數數量。
示例:
/* Main program */ call add 1,2 exit add: PARSE ARG a,b say arg() c = a + b say c
執行上述程式後,我們將得到以下結果。
2 3
arg(index)
此方法用於返回特定位置的引數值。
語法:
arg(index)
引數
索引:要返回的引數的索引位置。
返回值:此方法返回特定位置的引數值。
示例:
/* Main program */ call add 1,2 exit add: PARSE ARG a,b say arg(1) c = a + b say c
執行上述程式後,我們將得到以下結果。
1 3
Rexx - 內建函式
每種程式語言都有一些內建函式,可以幫助程式設計師完成一些例行任務。Rexx 也具有許多內建函式。
讓我們看看 Rexx 中所有這些可用的函式。
| 序號 | Rexx 中可用的函式 |
|---|---|
| 1 | ADDRESS
此方法返回當前執行 Rexx 命令的環境的名稱。 |
| 2 | BEEP
此方法在系統中以特定頻率和持續時間發出聲音。 |
| 3 | DataType
如果輸入是有效數字,則此方法返回“NUM”的值;否則,它將返回“CHAR”的值。您還可以指定是否要將輸入值與 NUM 或 CHAR 值進行比較。在每種情況下,返回的值將根據結果為 1 或 0。 |
| 4 | DATE
此方法返回以下格式的本地日期。 |
| 5 | DIGITS
此方法返回當前系統中定義的 NUMERIC DIGITS 的當前設定。 |
| 6 | ERRORTEXT
此方法返回與錯誤號“errorno”關聯的 Rexx 錯誤訊息。請注意,錯誤號必須是 0 到 99 之間的值。這在您的程式返回錯誤程式碼並且您想知道錯誤程式碼的含義的情況下非常有用。 |
| 7 | FORM
此方法返回用於在系統上進行數學計算的“NUMERIC FORM”的當前設定。 |
| 8 | TIME
此方法返回以下程式所示的 24 小時制格式的本地時間。 |
| 9 | USERID
此方法返回登入到系統的當前使用者 ID。 |
| 10 | XRANGE
此方法返回由起始字元和結束字元指定的範圍內的字元。 |
| 11 | X2D
此方法返回 **十六進位制字串值** 的十進位制轉換。 |
| 12 | X2C
此方法返回十六進位制字串值的字元轉換。 |
Rexx - 系統命令
Rexx 的最大優點之一是能夠建立可重用的指令碼。如今,在組織中,擁有可重用的指令碼對於節省執行常見重複性任務的時間具有很大的附加值。
例如,IT 組織中的技術團隊可能需要擁有執行日常常見任務的指令碼。這些任務可能包括與作業系統的互動。然後可以對這些指令碼進行程式設計以處理錯誤的返回程式碼或錯誤。
Rexx 提供了許多系統命令,可用於執行此類重複性任務。讓我們看看 Rexx 中提供的一些系統命令。
dir
這是 Windows 中使用的普通目錄列表命令。
語法
dir
引數
無
返回值
此方法返回系統上的當前目錄列表。
示例
/* Main program */ dir
輸出取決於系統中的目錄。
下面的程式只是一個例子。
輸出
Volume in drive D is LENOVO
Volume Serial Number is BAC9-9E3F
Directory of D:\
04/06/2016 12:52 AM 268,205 100008676689.pdf
10/20/2015 08:51 PM <DIR> data
06/01/2016 10:23 AM 31 Example.txt
10/28/2014 06:55 PM <DIR> Intel
06/02/2016 11:15 AM 23 main.rexx
12/22/2014 08:49 AM <DIR> PerfLogs
12/13/2015 11:45 PM <DIR> Program Files
12/24/2015 10:26 AM <DIR> Program Files (x86)
07/17/2015 01:21 AM <DIR> Users
12/23/2015 10:01 AM <DIR> Windows
3 File(s) 268,259 bytes
7 Dir(s) 202,567,680 bytes free
以下程式顯示了 **dir 命令** 的另一個示例。只是這一次我們使用了 **特殊的 rc 變數**。此變數在 Rexx 中是特殊的,它為您提供系統命令執行的狀態。如果返回的值為 0,則表示命令已成功執行。否則,錯誤號將顯示在 rc 變數名中。
示例
/* Main program */ dir if rc = 0 then say 'The command executed successfully' else say 'The command failed, The error code is =' rc
執行上述程式後,我們將得到以下結果。
輸出
The command failed, The error code is = 127
重定向命令
Rexx 還具有使用重定向命令的功能。Rexx 中提供了以下重定向命令。
**<** - 此命令用於接收來自檔案的輸入。
**>** - 此命令用於將內容輸出到檔案。如果檔案存在,它將被覆蓋。
**>>** - 這也用於將內容輸出到檔案。但是輸出被新增到檔案的末尾以保留檔案的現有內容。
讓我們來看一個如何使用重定向命令的示例。在下面的示例中,我們使用 sort 命令對名為 **sortin.txt** 的檔案進行排序。檔案中的資料被髮送到 sort 命令。然後將 sort 命令的輸出傳送到 sortout.txt 檔案。
示例
/* Main program */ 'sort <sortin.txt> sortout.txt'
假設 sortin.txt 檔案包含以下資料。
輸出
b c a
然後 sortout.txt 檔案將包含以下資料。
a b c
ADDRESS 函式
此方法用於找出用於輸入、錯誤和輸出流的預設環境是什麼。
語法
ADDRESS(options)
引數
特定系統的地址選項。
返回值
此方法返回輸入、錯誤和輸出流的環境名稱。
示例
/* Main program */
say ADDRESS('I')
say ADDRESS('O')
say ADDRESS('E')
執行上述程式後,我們將得到以下結果。
輸出
INPUT NORMAL REPLACE NORMAL REPLACE NORMAL
Rexx - XML
XML 是一種可移植的開源語言,允許程式設計師開發其他應用程式可以讀取的應用程式,而不管作業系統和/或開發語言如何。這是用於在應用程式之間交換資料的最常見語言之一。
什麼是 XML?
可擴充套件標記語言 XML 是一種標記語言,類似於 HTML 或 SGML。它由全球資訊網聯盟 (World Wide Web Consortium) 推薦,並作為開放標準提供。XML 非常適合跟蹤少量到中等數量的資料,而無需 SQL 資料庫的支援。
對於我們所有的 XML 程式碼示例,讓我們使用以下簡單的 XML 檔案 **movies.xml** 來構建 XML 檔案並隨後讀取該檔案。
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<year>1986</year>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stam pede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<year>1987</year>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom </description>
</movie>
</collection>
入門
預設情況下,Rexx 直譯器中不包含 xml 功能。為了在 Rexx 中使用 XML,需要遵循以下步驟。
下載以下檔案:
Rexxxml − www.interlog.com/~ptjm/
Libxml2 − www.ctindustries.net/libxml/
iconv-1.9.2.win32 − www.xmlsoft.org/sources/win32/oldreleases/
libxslt-1.1.26.win32 − www.xmlsoft.org/sources/win32/oldreleases/
解壓所有檔案,並確保它們包含在系統路徑中。
載入 XML 函式
一旦下載併成功註冊了上一節中的所有檔案,下一步就是編寫程式碼來載入 Rexx XML 函式。這可以透過以下程式碼完成。
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
關於上述程式,需要注意以下幾點:
函式 **rxfuncadd** 用於載入外部庫。**xmlloadfuncs** 函式用於將 **rexxxml** 檔案中的所有庫載入到記憶體中。
如果 rcc<>0,則會發生錯誤。為此,我們可以呼叫 **rxfuncerrmsg** 來獲取有關錯誤訊息的更多詳細資訊。
我們最終呼叫 **xmlloadfuncs**,以便現在可以在 Rexx 程式中啟用所有與 xml 相關的功能。
讓我們看看在 **Rexx 中可用的各種 XML 方法**。
xmlVersion
此方法返回系統上使用的 XML 和 XSLT 庫的版本。
語法
xmlVersion()
引數
無
返回值
此方法返回系統上使用的 XML 和 XSLT 庫的版本。
示例
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
say xmlVersion()
執行上述程式後,我們將得到以下結果。這再次取決於系統上使用的 XML 庫的版本。
輸出
1.0.0 20631 10126
xmlParseXML
此函式用於解析傳送到函式的 XML 資料。文件樹由函式返回。
語法
xmlParseXML(filename)
引數
**檔名** - 這是需要解析的 XML 檔案的名稱。
返回值
函式返回文件樹。否則,如果發生錯誤,則返回 0。
示例
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
say xmlVersion()
sw = xmlParseXML('test.xml')
輸出
無一般輸出。
xmlFindNode
此方法評估傳遞給它的 **XPath 表示式**。這用於解析文件樹以生成可以進一步處理的 **節點集**。
語法
xmlParseXML(XPath,document)
引數
**XPath** - 這是 xml 檔案中節點的路徑。
**文件** - 這是 XML 文件
返回值
評估 XPath 表示式並將結果作為節點集返回,以便稍後使用。
示例
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
say xmlVersion()
document = xmlParseXML('test.xml')
nodeset = xmlFindNode('//movie', document)
say xmlNodesetCount(nodeset)
執行上述程式後,我們將得到以下結果。
輸出
4
輸出顯示了我們的 xml 列表中電影節點的數量
xmlEvalExpression
以下方法用於評估 XPath 表示式並返回字串作為結果。
語法
xmlParseXML(XPath,Node)
引數
**XPath** - 這是 xml 檔案中節點的路徑。
**文件** - 特定的節點元素。
返回值
根據傳送給它的 XPath 表示式返回一個字串。
示例
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
document = xmlParseXML('test.xml')
nodeset = xmlFindNode('//movie', document)
do j = 1 to xmlNodesetCount(nodeset)
value = xmlEvalExpression('type', xmlNodesetItem(nodeset, j))
say value
end
執行上述程式後,我們將得到以下結果。
輸出
War, Thriller Anime, Science Fiction Anime, Action Comedy
Rexx - Regina
Regina 是另一個可用於編譯和執行 Rexx 程式的 Rexx 直譯器。Regina 的官方網站是:www.regina-rexx.sourceforge.net/
使用 Regina 的一些優點如下:
Regina 可以在任何平臺上執行,無論是 Windows、Linux 還是 Mac OS。
Regina 符合所有可用標準。
Regina 擁有龐大的社群支援,因此有很多論壇和學習資料可用於 Regina。
Regina 提供了許多用於編寫和測試 Rexx 程式的工具。
在 Regina 中,您可以執行在預設 Rexx 直譯器中不可能執行的命令。例如,如果您包含某些配置設定,您實際上可以執行基本的系統級命令,這在 Rexx 中是不可能的。
當您透過 **第 2 章 – Rexx 環境** 中記錄的安裝方法安裝 Rexx 時,Regina 直譯器也會隨之安裝。
現在讓我們看看使用 Regina 時可用的某些常用方法。這些函式是透過正常使用不可用的擴充套件函式。
要使用擴充套件函式,您需要包含以下程式碼行。這將啟用 Regina 擴充套件函式的使用。
options arexx_bifs
其次,在執行所有 Rexx 程式時,使用以下命令。
regina main.rexx
其中:
**regina** - 這是用於 Rexx 程式的直譯器。
**main.rexx** - 您的 Rexx 程式。
我們現在將詳細討論 **Regina Rexx 直譯器的各種函式**。
| 序號 | Regina Rexx 直譯器的函式 |
|---|---|
| 1 | b2c
此方法用於將二進位制值轉換為字串值。 |
| 2 | bitcomp
此方法用於逐位比較兩個位字串。 |
| 3 | bittst
此方法用於指示位字串中指定位的狀態。 |
| 4 | find
此方法用於搜尋另一個字串中字串的第一次出現。 |
| 5 | getenv
此方法返回系統上環境變數的值。 |
| 6 | getpid
此方法用於獲取當前正在執行的程序 ID 的值。 |
| 7 | hash
此方法將字串的雜湊屬性作為十進位制數字返回。它還會更新字串的內部雜湊值。 |
| 8 | justify
此方法用於根據長度值新增字串值的對齊或修剪。 |
| 9 | putenv
此方法用於設定環境變數的值。 |
| 10 | directory
此方法獲取系統上當前目錄的值。 |
| 11 | chdir
此方法更改系統上當前工作目錄的值。 |
| 12 | randu
此方法返回 0 到 1 之間的偽隨機數。 |
Rexx - 解析
Rexx 最強大的功能之一是它能夠解析文字值。您可能在任何其他程式語言中都看不到這一點。
parse 語句的一般格式如下:
語法
PARSE {UPPER|LOWER|CASELESS} source {template}
其中:
**UPPER** - 在解析之前,原始碼將轉換為大寫。
**LOWER** - 在解析之前,原始碼將轉換為小寫。
**CASELESS** - 傳遞此引數時,將忽略大小寫。
**源** - 這是需要解析的源。為此提供了許多選項,並且可以是以下任何一種:
**ARG** - 程式或過程的引數可以用作源。
**LINEIN** - 下一行輸入可以用作源。
**SOURCE** - 程式的源資訊可以用作源。
**VAR name** - 變數名的值可以用作源。
**模板** - 此引數指定如何解析源。為此提供了許多選項。下面提到其中一些。
**變數名** - 分配給變數的值。
**字面字串** - 可用作分割字串的模式的字面字串。
**#** - 源本身內的絕對字元位置。因此,如果您指定值為 5,則將使用第 5 個字元。
**+#** - 源本身內的相對字元位置。因此,如果您指定值為 5,則將相對使用第 5 個字元。
讓我們來看一個如何在 Rexx 中完成解析的簡單示例。
示例
/* Main program */ parse value 'This is a Tutorial' with word1 word2 word3 word4 say "'"word1"'" say "'"word2"'" say "'"word3"'" say "'"word4"'"
上述程式解析短語中的單詞。當一個值由僅用一個空格分隔的單片語成,並且沒有前導或尾隨空格時,該值很容易解析為已知數量的單詞,如下所示。
parse 函式用於在 Rexx 中獲取字串值,然後將其分解為單詞。在上面的示例中,單詞隨後被拆分並存儲在單詞變數中。
上述程式的輸出將如下所示:
'This' 'is' 'a' 'Tutorial'
以下程式顯示了另一個解析示例。這次我們使用 while 子句來進行解析。
示例
/* Main program */ phrase = 'This is a Tutorial' do while phrase <> '' parse var phrase word phrase say "'"word"'" end
上述程式將給出以下輸出:
'This' 'is' 'a' 'Tutorial'
位置解析
Rexx 還允許使用位置解析。讓我們來看一個如何使用 parse 語句實現位置解析的示例。
示例
/* Main program */ testString = "Doe John M. 03/03/78 Mumbai India"; parse var testString name1 11 name2 21 birthday 31 town 51 country say name1 say name2 say birthday say town say country
從上面的示例中,您可以注意到,除了變數名之外,我們還指定了字串應該結束的位置。因此,對於 name1,我們應該以第 11 個字元結束,然後開始解析 name2。
上述程式的輸出如下:
Doe John M. 03/03/78 Mumbai India
在這種情況下,您還可以使用 **相對位置解析**。
示例
/* Main program */ testString = "Doe John M. 03/03/78 Mumbai India"; parse var testString name1 +10 name2 +10 birthday +10 town +20 country say name1 say name2 say birthday say town say country
上述程式的輸出將如下所示。
Doe John M. 03/03/78 Mumbai India
Rexx - 訊號
在 Rexx 中,signal 指令通常用於兩種目的:
一種是將控制轉移到程式的另一部分。這通常類似於其他程式語言中使用的 go-to 標籤。
另一種是轉到特定的 trap 標籤。
如果在以下任何指令命令中使用 signal 命令,則掛起的控制結構將自動停用。
if ... then ... else ...
do ... end
do i = 1 to n ... end [以及類似的 do 迴圈]
select when ... then ... ...etc. otherwise ... end
signal 語句的一般語法如下所示:
語法
signal labelName signal [ VALUE ] labelExpression
讓我們來看一個如何使用 signal 語句的示例。
示例
/* Main program */ n = 100.45 if \ datatype( n, wholenumber ) then signal msg say 'This is a whole number' return 0 msg : say 'This is an incorrect number'
上述程式的輸出將如下所示。
輸出
This is an incorrect number.
如果您將變數 n 的值更改為如下程式所示的整數:
/* Main program */ n = 100 if \ datatype( n, wholenumber ) then signal msg say ' This is a whole number ' return 0 msg : say ' This is an incorrect number '
您將獲得以下輸出:
This is a whole number
也可以像以下程式所示那樣轉移到標籤的值:
/* Main program */ n = 1 if \ datatype( n, wholenumber ) then signal msg if n < 1 | n > 3 then signal msg signal value n 3 : say 'This is the number 3' 2 : say ' This is the number 2' 1 : say ' This is the number 1' return n msg : say ' This is an incorrect number ' exit 99
上述程式的輸出將顯示如下:
This is the number 1
Trap 標籤轉移啟用/停用
如前所述,signal 指令也可用於將控制轉移到 trap 標籤。
Trap 標籤轉移的一般語法如下:
語法
signal ON conditionName [ NAME Label ] signal OFF conditionName
其中:
**conditionName** - 這是應該開啟或關閉訊號的條件。
**標籤** - 程式應轉移到的可選標籤。
讓我們來看一個使用 trap 標籤轉移的示例。
示例
/* Main program */ signal on error signal on failure signal on syntax signal on novalue beep(1) signal off error signal off failure signal off syntax signal off novalue exit 0 error: failure: syntax: novalue: say 'An error has occured'
在上面的示例中,我們首先開啟錯誤訊號。然後,我們新增一個將導致錯誤的語句。然後,我們使用錯誤 trap 標籤來顯示自定義錯誤訊息。
上述程式的輸出將如下所示:
An error has occurred.
Rexx - 除錯
除錯是任何程式語言中的重要功能。它幫助開發人員診斷錯誤,找到根本原因,然後相應地解決它們。在 Rexx 中,trace 實用程式用於除錯。trace 指令可以透過兩種方式實現,一種是批處理模式,另一種是互動模式。讓我們看看如何實現這兩個選項。
批處理模式下的 Trace
trace 命令用於詳細顯示執行的每個 Rexx 命令。
trace 語句的通用語法如下所示:
語法
trace [setting]
其中,設定可以是以下任何選項:
A - 追蹤所有命令。
C - 只追蹤傳送到作業系統的宿主命令。
E - 只追蹤傳送到作業系統並導致錯誤的宿主命令。
F - 只追蹤傳送到作業系統並導致失敗的宿主命令。
I - 提供 Rexx 命令的中級追蹤。
L - 如果你想在追蹤發生時進行標記,可以使用此選項。
N - 這是預設選項,不進行任何追蹤。
讓我們來看一個 trace 命令的例子。
示例
/* Main program */ trace A /* Main program */ n = 100.45 if datatype( n, wholenumber ) then signal msg say 'This is a whole number' return 0 msg : say ' This is an incorrect number '
上述程式的輸出如下:
5 *-* n = 100.45 if datatype( n, wholenumber ) then signal msg 7 *-* say 'This is a whole number This is a whole number 8 *-* return 0
從輸出中,您可以看到程式輸出中添加了額外的追蹤資訊。關於輸出,需要注意以下幾點:
執行語句的行號已新增到追蹤輸出中。
追蹤輸出中顯示了每行執行的程式碼。
Trace 函式
也可以使用 trace 函式啟用追蹤。通用語法和示例如下所示。
語法
trace()
上述函式返回當前的追蹤級別。
引數
無
返回值
上述函式返回當前的追蹤級別。
示例
/* Main program */ say trace() /* Main program */ n = 100.45 if datatype( n, wholenumber ) then signal msg say 'This is a whole number' return 0 msg : say 'This is an incorrect number '
上述程式的輸出如下。
N This is an incorrect number
第一行的 N 表示追蹤設定為正常。
設定追蹤值
可以使用 trace 函式設定追蹤級別。通用語法和示例如下所示。
語法
trace(travel_level)
引數
trace_level - 這與設定追蹤級別可用的選項類似。
返回值
上述函式返回當前的追蹤級別。
示例
/* Main program */
say trace()
current_trace = trace('A')
say current_trace
/* Main program */
n = 100.45 if datatype( n, wholenumber ) then
signal msg say 'This is a whole number'
return 0
msg :
say ' This is an incorrect number '
上述程式的輸出如下:
N 4 *-* say current_trace N 6 *-* n = 100.45 7 *-* if \ datatype( n, wholenumber ) then 8 *-* signal msg 12 *-* say 'This is an incorrect number' 'This is an incorrect number'
互動式追蹤
互動式追蹤是指在程式執行時進行追蹤。就像在 Visual Studio for .Net 等 IDE 中,您可以新增斷點並檢視每條語句的執行情況一樣,在這裡您也可以在每行程式碼執行時檢視程式。
通用語法如下:
語法
trace ?options
其中,選項與 trace 命令的選項相同,如下所示。
A - 追蹤所有命令
C - 只追蹤傳送到作業系統的宿主命令。
E - 只追蹤傳送到作業系統並導致錯誤的宿主命令。
F - 只追蹤傳送到作業系統並導致失敗的宿主命令。
I - 提供 Rexx 命令的中級追蹤。
L - 如果你想在追蹤發生時進行標記,可以使用此選項。
N - 這是預設選項,不進行任何追蹤。
讓我們來看一個實現主動追蹤的例子。
示例
/* Main program */ trace ?A /* Main program */ n = 100.45 if datatype( n, wholenumber ) then signal msg say 'This is a whole number' return 0 msg : say 'This is an incorrect number'
上述程式的輸出將如下所示。追蹤將在每一行程式碼處停止;然後,您需要按 Enter 鍵才能移動到下一行程式碼。
This is an incorrect number
+++ "LINUX COMMAND /home/cg/root/5798511/main.rex"
5 *-* n = 100.45 if datatype( n, wholenumber ) then
+++ Interactive trace. "Trace Off" to end debug, ENTER to Continue. +++
6 *-* signal msg
10 *-* msg :
10 *-* say 'This is an incorrect number'
Rexx - 錯誤處理
Rexx 也像其他程式語言一樣能夠處理錯誤。
以下是 Rexx 中的一些常見錯誤條件。
ERROR - 每當傳送到作業系統的命令導致錯誤時,都會引發此事件。
FAILURE - 每當傳送到作業系統的命令導致失敗時,都會引發此事件。
HALT - 通常在某個操作依賴於另一個操作時引發。例如,如果 I/O 操作由於任何原因被中斷。
NOVALUE - 當變數未賦值時,會引發此事件。
NOTREADY - 任何未準備好接受任何操作的 I/O 裝置都會引發此事件。
SYNTAX - 如果程式碼中存在任何語法錯誤,則會引發此事件。
LOSTDIGITS - 當算術運算導致運算過程中數字丟失時,會引發此事件。
捕獲錯誤
可以使用 signal 命令捕獲錯誤。讓我們來看一下語法和一個示例。
語法
signal on [Errorcondition]
其中:
Errorcondition - 這是上面給出的錯誤條件。
示例
讓我們來看一個關於這方面的例子。
/* Main program */ signal on error signal on failure signal on syntax signal on novalue beep(1) signal off error signal off failure signal off syntax signal off novalue exit 0 error: failure: syntax: novalue: say 'An error has occured'
在上面的示例中,我們首先開啟錯誤訊號。然後,我們新增一個將導致錯誤的語句。然後,我們使用錯誤 trap 標籤來顯示自定義錯誤訊息。
上述程式的輸出將如下所示。
An error has occurred.
以下程式顯示了一個錯誤程式碼示例。
/* Main program */ signal on error signal on failure signal on syntax signal on novalue beep(1) exit 0 error: failure: syntax: novalue: say 'An error has occured' say rc say sigl
上述程式的輸出將如下所示。
An error has occured 40 6
Rexx - 面向物件
根據環境章節安裝 ooRexx 後,您還可以使用類和物件。請注意,以下所有程式碼都需要在 ooRexx 直譯器中執行。普通的 Rexx 直譯器將無法執行此面向物件的程式碼。
類和方法宣告
類使用以下語法宣告定義。
語法
::class classname
其中 classname 是賦予類的名稱。
類中的方法使用以下語法宣告定義。
語法
::method methodname
其中 methodname 是賦予方法的名稱。
類中的屬性使用以下語法宣告定義。
語法
::attribute propertyname
其中 propertyname 是賦予屬性的名稱。
示例
以下是一個 Rexx 類示例。
::class student ::attribute StudentID ::attribute StudentName
關於上述程式,需要注意以下幾點:
- 類的名稱是 student。
- 該類具有 2 個屬性,StudentID 和 StudentName。
Getter 和 Setter 方法
Getter 和 Setter 方法用於自動設定和獲取屬性的值。在 Rexx 中,當使用 attribute 關鍵字宣告屬性時,Getter 和 Setter 方法已就位。
示例
::class student ::attribute StudentID ::attribute StudentName
在上面的示例中,將會有 StudentId 和 StudentName 的 Getter 和 Setter 方法。
以下程式顯示瞭如何使用它們。
/* Main program */ value = .student~new value~StudentID = 1 value~StudentName = 'Joe' say value~StudentID say value~StudentName exit 0 ::class student ::attribute StudentID ::attribute StudentName
上述程式的輸出將如下所示。
1 Joe
例項方法
可以使用 ~new 運算子從類建立物件。可以按以下方式呼叫類中的方法。
Object~methodname
其中 methodname 是需要從類中呼叫的方法。
示例
以下示例顯示瞭如何從類建立物件以及如何呼叫相應的方法。
/* Main program */ value = .student~new value~StudentID = 1 value~StudentName = 'Joe' value~Marks1 = 10 value~Marks2 = 20 value~Marks3 = 30 total = value~Total(value~Marks1,value~Marks2,value~Marks3) say total exit 0 ::class student ::attribute StudentID ::attribute StudentName ::attribute Marks1 ::attribute Marks2 ::attribute Marks3 ::method 'Total' use arg a,b,c return (ABS(a) + ABS(b) + ABS(c))
上述程式的輸出將如下所示。
60
建立多個物件
也可以建立類的多個物件。以下示例將演示如何實現此目的。
在這裡,我們建立了 3 個物件(st、st1 和 st2),並相應地呼叫它們的例項成員和例項方法。
讓我們來看一個如何建立多個物件的例子。
示例
/* Main program */ st = .student~new st~StudentID = 1 st~StudentName = 'Joe' st~Marks1 = 10 st~Marks2 = 20 st~Marks3 = 30 total = st~Total(st~Marks1,st~Marks2,st~Marks3) say total st1 = .student~new st1~StudentID = 2 st1~StudentName = 'John' st1~Marks1 = 10 st1~Marks2 = 20 st1~Marks3 = 40 total = st1~Total(st1~Marks1,st1~Marks2,st1~Marks3) say total st2 = .student~new st2~StudentID = 3 st2~StudentName = 'Mark' st2~Marks1 = 10 st2~Marks2 = 20 st2~Marks3 = 30 total = st2~Total(st2~Marks1,st2~Marks2,st2~Marks3) say total exit 0 ::class student ::attribute StudentID ::attribute StudentName ::attribute Marks1 ::attribute Marks2 ::attribute Marks3 ::method 'Total' use arg a,b,c return (ABS(a) + ABS(b) + ABS(c))
上述程式的輸出將如下所示。
60 70 60
繼承
繼承可以定義為一個類獲取另一個類的屬性(方法和欄位)的過程。透過使用繼承,資訊以分層的方式進行管理。
繼承其他屬性的類稱為子類(派生類、子類),其屬性被繼承的類稱為超類(基類、父類)。
讓我們來看一個 Rexx 中繼承的例子。在下面的例子中,我們建立一個名為Person的類。然後我們使用子類關鍵字建立一個Student 類作為Person 的子類。
示例
/* Main program */ st = .student~new st~StudentID = 1 st~StudentName = 'Joe' st~Marks1 = 10 st~Marks2 = 20 st~Marks3 = 30 say st~Total(st~Marks1,st~Marks2,st~Marks3) exit 0 ::class Person ::class student subclass Person ::attribute StudentID ::attribute StudentName ::attribute Marks1 ::attribute Marks2 ::attribute Marks3 ::method 'Total' use arg a,b,c return (ABS(a) + ABS(b) + ABS(c))
上述程式的輸出將如下所示。
60
Rexx - 可移植性
可移植性是任何程式語言中的一個重要方面。眾所周知,Rexx 可用於各種作業系統,例如 Windows 和 Linux。因此,需要確保當在 Windows 平臺上開發程式時,如果相同的程式在 Linux 平臺上執行,則已採取必要的預防措施。
Rexx 能夠執行系統級命令。有一些命令可用於瞭解其正在執行的作業系統。根據輸出,它可以採取適當的操作來檢視可以在此作業系統上執行哪些命令。
示例
以下示例顯示瞭如何使用 parse 函式獲取程式正在執行的作業系統的詳細資訊。
/* Main program */
parse version language level date month year.
parse source system invocation filename.
language = translate(language)
if pos('REGINA',language) = 0 then
say 'Error , the default interpreter is not Regina' language
say 'The Interpreter version/release date is:' date month year
say 'The Language level is: ' level say 'The Operating System is'
select
when system = 'WIN32' then
'ver'
when system = 'UNIX' | system = 'LINUX' then
'uname -a'
otherwise
say 'Unknown System:' system
end
if rc <> 0 then
say 'Error :' rc
輸出將根據作業系統而有所不同。下面給出一個示例輸出。
The Interpreter version/release date: 5 Apr 2015 The Language level is: 5.00 The Operating System is Unknown System: WIN64 Bad return code: RC
Rexx - 擴充套件函式
Rexx 提供了許多擴充套件函式,這些函式提供了廣泛的功能,其中大部分函式允許您與作業系統互動。讓我們詳細瞭解一下它們,如下所述。
| 序號 | 擴充套件函式 |
|---|---|
| 1 | b2c
此函式將二進位制值轉換為字串值。 |
| 2 | bitclr
此函式用於將二進位制字串中指定的位切換為 0。 |
| 3 | bitcomp
此函式用於比較從位 0 開始的兩個二進位制字串。 |
| 4 | buftype
此函式用於顯示堆疊的內容,通常用於除錯目的。 |
| 5 | crypt
此函式用於加密字串。 |
| 6 | fork
此函式用於在系統上生成新的子程序。 |
| 7 | getpid
此函式獲取當前正在執行的程序的 ID。 |
| 8 | hash
此函式返回字串的雜湊值。 |
Rexx - 指令
Rexx 提供了許多指令,這些指令提供了廣泛的功能,其中大部分函式允許您與作業系統互動。讓我們詳細瞭解一下它們。
| 序號 | Rexx 指令 |
|---|---|
| 1 | address
此函式用於顯示當前命令環境。 |
| 2 | drop
此函式用於取消分配變數。 |
| 3 | interpret
解釋或執行已定義的指令。 |
| 4 | nop
此函式表示不執行任何操作。此命令通常用於if 語句中。 |
| 5 | Pull
這用於從堆疊或預設流中提取輸入。 |
| 6 | push
這用於將值推送到 Rexx 堆疊。 |
Rexx - 實現
正如我們在前幾章中已經看到的,Rexx 語言有很多不同的實現。每種實現都有其自身的功能。讓我們來看一下 Rexx 可用的各種實現。
OoRexx
這是 Rexx 的面向物件版本。預設情況下,Rexx 基本實現都是基於過程的。但是使用 ooRexx,您可以透過採用面向物件的方法來處理 Rexx 來提供更大的靈活性。透過使用 ooRexx,您可以透過建立可重用的類和物件來更好地重用。
以下程式是一個簡單的 Rexx 程式示例,可以使用 ooRexx 實現器執行。
示例
/* Main program */ say ‘hello’
要執行此程式,請執行以下命令。
rexx main.rexx
執行上述命令後,您將獲得以下輸出。
hello
Netrexx
這是為所有基於 Java 的開發人員提供的,因為它為 Rexx 語言提供了一個基於 Java 的替代方案。因此,所有物件都基於 Java 物件模型。此框架的優勢在於,由於 Java 是一種非常流行的語言,因此開發人員更容易使用此框架。因此,在此實現中,Rexx 程式碼被轉換為 Java 程式,然後可以在任何 Java 虛擬機器上執行。
以下程式碼是一個 NetRexx 程式示例。
建立一個名為main.nrx的檔案,並將以下程式碼放入檔案中。
/* Main program */ say ‘hello’
要編譯程式碼,請執行以下命令:
NetRexxC main.nrx
然後您將獲得以下輸出。NetRexxC 是將 Rexx 程式轉換為其 Java 等價物的編譯器。
java -cp ";;G:\NetRexx-3.04GA\lib\NetRexxF.jar;." -Dnrx.compiler = ecj org.netrexx.process.NetRexxC main.nrx NetRexx portable processor 3.04 GA build 4-20150630-1657 Copyright (c) RexxLA, 2011,2015. All rights reserved. Parts Copyright (c) IBM Corporation, 1995,2008. Program main.nrx Compilation of 'main.nrx' successful
您現在可以使用以下 Java 命令執行您的 Java 程式。
java main
執行上述命令後,您將獲得以下輸出。
Hello
Brexx
這是 Rexx 的輕量級實現。這是一個比標準 Rexx 實現器更輕量級的包。但它仍然具有 Rexx 的全部功能。
以下程式碼是一個 BRexx 程式示例。
/* Main program */ say ‘hello’
要執行程式,請執行以下命令。
rexx32 main.rexx
執行上述命令後,您將獲得以下輸出。
hello
Rexx - Netrexx
NetRexx 是 Rexx 的 Java 實現。在 NetRexx 中,實現器用於將 Rexx 程式轉換為 Java 程式,然後可以在任何 Java 虛擬機器上執行。
設定 NetRexx
NetRexx 的第一步是在本地機器上進行設定。為此,需要執行以下步驟:
步驟 1 − 前往 NetRexx 下載網站 − http://www.netrexx.org/downloads.nsp
下載 NetRexx.3.04.GA 檔案。
步驟 2 − 確保已安裝 Java 並正在您的系統上執行。您可以使用 java -version 命令驗證 Java 是否正在執行。
下面顯示了輸出示例。
H:\>java -version java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) Client VM (build 24.79-b02, mixed mode, sharing)
步驟 3 − 解壓縮 NetRexx 壓縮檔案的內容。將檔案從 NetRexx3.04GA\lib 資料夾複製到您的 Java 安裝/lib/etc 資料夾。
步驟 4 − 將 NetRexx-3.04GA\bin 路徑新增到系統的 PATH 環境變數中。
執行第一個 NetRexx 程式
建立一個名為main.nrx的檔案,並將以下程式碼放入檔案中。
/* Main program */ say ‘hello’
要編譯程式碼,請執行以下命令。
NetRexxC main.nrx
然後您將獲得以下輸出。NetRexxC 是將 Rexx 程式轉換為其 Java 等效程式的編譯器。
java -cp ";;G:\NetRexx-3.04GA\lib\NetRexxF.jar;." -Dnrx.compiler = ecj org.netrexx.process.NetRexxC main.nrx NetRexx portable processor 3.04 GA build 4-20150630-1657 Copyright (c) RexxLA, 2011,2015. All rights reserved. Parts Copyright (c) IBM Corporation, 1995,2008. Program main.nrx Compilation of 'main.nrx' successful
您現在可以使用以下 Java 命令執行您的 Java 程式。
java main
執行上述命令後,您將獲得以下輸出。
Hello
現在讓我們討論一下NetRexx 庫的一些特殊方面。
索引字串
在 NetRexx 中,字串可以成為陣列的索引。下面顯示了一個示例。
示例
/* Main program */ value = 'unknown' value['a'] = 'b' c = 'a' say value[c]
執行上述程式時,我們將得到以下結果。
輸出
b
多個索引
在 NetRexx 中,陣列可以具有多個索引。下面顯示了一個示例。
示例
/* Main program */ value = 'null' value['a', 'b'] = 1 say value['a', 'b']
執行上述程式後,我們將得到以下結果。
輸出
1
| 序號 | 命令和描述 |
|---|---|
| 1 | ask 命令
此命令用於從預設輸入流讀取一行。 |
| 2 | digits 命令
此命令用於顯示 digits 值的當前值。 |
| 3 | form 命令
此命令用於顯示 form 值的當前值。 |
| 4 | length 命令
此命令用於顯示字串值的長度。 |
| 5 | version 命令
此命令用於返回當前使用的 NetRexx 版本。 |
| 6 | trace 命令
此命令用於返回 NetRexx 當前使用的跟蹤設定。 |
Rexx - Brexx
BRexx 是 Rexx 的輕量級實現。它仍然可以作為 Rexx 實現的一部分提供許多功能。
設定 BRexx
BRexx 的第一步是在本地機器上進行設定。為此,需要執行以下步驟:
步驟 1 − 前往 BRexx 下載網站 − https://ftp.gwdg.de/pub/languages/rexx/brexx/html/rx.html
轉到下載部分並下載產品。
步驟 2 − 解壓縮 Brexx 壓縮檔案的內容。
步驟 3 − 將 BRexx\bin 路徑新增到系統的 PATH 環境變數中。
步驟 4 − 建立一個名為 RXLIB 的新環境變數,並將其指向 Brexx 資料夾中的 lib 資料夾。
執行第一個 BRexx 程式
建立一個名為main.rexx的檔案,並將以下程式碼放入該檔案中。
/* Main program */ say ‘hello’
要執行程式,請執行以下命令。
rexx32 main.rexx
執行上述命令後,您將獲得以下輸出。
hello
現在讓我們討論一下 BRexx 庫中一些最常用的函式。
| 序號 | BRexx 庫中可用的函式 |
|---|---|
| 1 | acos 命令
此命令用於獲取數字的反餘弦轉換。 |
| 2 | cos 命令
此命令用於獲取數字的餘弦轉換。 |
| 3 | sin 命令
此命令用於獲取數字的正弦轉換。 |
| 4 | asin 命令
此命令用於獲取數字的反正弦轉換。 |
| 5 | tan 命令
此命令用於獲取數字的正切轉換。 |
| 6 | atan 命令
此命令用於獲取數字的反正切轉換。 |
| 7 | mkdir 命令
此命令用於在當前工作目錄中建立一個目錄。 |
| 8 | rmdir 命令
此命令用於刪除當前工作目錄中的目錄。 |
| 9 | dir 命令
此命令用於返回整個目錄列表。 |
Rexx - 資料庫
Rexx 能夠與各種資料庫一起工作,如下所示。
- HSQLDB
- Oracle
- SQL Server
- MySQL
- MongoDB
單擊以下連結後,即可找到 Rexx 資料庫的所有資訊:https://rexxsql.sourceforge.net/
在我們的示例中,我們將使用 MySQL DB 作為示例。因此,第一步是確保從 Rexx SQL 網站下載所需的驅動程式,以便 Rexx 程式可以相應地與 SQL 一起工作。因此,請按照後續步驟確保 Rexx 程式可以與 MySQL 資料庫一起工作。
步驟 1 − 從 Rexx 網站訪問以下驅動程式下載頁面:https://sourceforge.net/projects/rexxsql/files/rexxsql/2.6/
步驟 2 − 下載 MYSQL 驅動程式 - rxsql26B3_my_w32_ooRexx
步驟 3 − 將內容解壓縮到本地計算機。
步驟 4 − 將解壓縮資料夾的路徑新增到計算機的 PATH 環境變數中。
對於所有後續示例,請確保以下要點已到位:
您已建立資料庫 TESTDB。
您已在 TESTDB 中建立表 EMPLOYEE。
此表包含欄位 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
已設定使用者 ID“testuser”和密碼“test123”以訪問 TESTDB。
確保您已下載 mysql jar 檔案並將其新增到您的類路徑中。
您已學習 MySQL 教程
資料庫連線
要建立資料庫連線,首先需要 Rexxsql DLL,然後使用 SQLConnect 函式建立與資料庫的連線。下面給出瞭如何實現此目的的語法和示例。
語法
SQLConnect(cname,username,password,dbname)
引數
cname − 這是要賦予連線的名稱。
username − 用於連線到資料庫的使用者名稱。
password − 用於連線到資料庫的密碼。
dbname − 要連線到的資料庫模式。
返回值
值為 0 表示資料庫連線成功。
示例
/* Main program */ Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' Call SQLLoadFuncs say SQLConnect(c1,' testuser ',' test123','testdb')
上述程式的輸出將如下所示。
0
建立資料庫表
連線到資料庫後的下一步是在資料庫中建立表。以下示例顯示瞭如何使用 Rexx 在資料庫中建立表。所有 Rexx SQL 命令都是使用 SQLCommand 函式執行的。
語法
SQLConnect(sname,statement)
引數
sname − 這是要賦予要執行的語句的名稱。
statement − 這是需要針對資料庫執行的語句。
返回值
值為 0 表示命令成功。
示例
/* Main program */ Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' Call SQLLoadFuncs if SQLConnect(c1,'testuser','test123','testdb') == 0 then say 'Connect Succedded' if SQLCommand(u1,"use testdb") == 0 then say 'Changed database to testdb' sqlstr = 'create table employee (first_name char(20) not null, last_name char(20),age int, sex char(1), income float)' if SQLCommand(c2,sqlstr) == 0 then say 'Employee table created'
上述程式的輸出將如下所示。
Connect Succedded Changed database to testdb Employee table created
資料庫表上的操作
以下型別的操作最常在資料庫表上執行。
| 序號 | 操作和描述 |
|---|---|
| 1 | 插入操作
當您想要將記錄建立到資料庫表中時,需要此操作。 |
| 2 | 讀取操作
任何資料庫上的讀取操作都意味著從資料庫中獲取一些有用的資訊。 |
| 3 | 更新操作
任何資料庫上的更新操作都意味著更新資料庫中已存在的一個或多個記錄。 |
| 4 | 刪除操作
當您想要從資料庫中刪除一些記錄時,需要刪除操作。 |
| 5 | 關閉連線
可以使用以下命令關閉與資料庫的連線。 |
執行事務
事務是一種確保資料一致性的機制。事務具有以下四個屬性:
原子性 − 事務要麼完成,要麼根本不會發生任何事情。
一致性 − 事務必須從一致狀態開始,並使系統處於一致狀態。
隔離性 − 事務的中間結果在當前事務之外不可見。
永續性 − 一旦事務提交,其效果就是持久的,即使在系統故障之後也是如此。
這是一個關於如何實現事務的簡單示例。
示例
/* Main program */ Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' Call SQLLoadFuncs if SQLConnect(c1,'testuser','test123','testdb') == 0 then say 'Connect Succedded' if SQLCommand(u1,"use testdb") == 0 then say 'Changed database to testdb' sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20" if SQLCommand(c2,sqlstr) == 0 then if sqlcommit() == 0 then say committed
上述程式的輸出將如下所示。
Connect Succedded Changed database to testdb COMMITTED
提交操作
提交操作會告訴資料庫繼續進行操作並完成對資料庫的所有更改。在上面的示例中,這是透過以下命令實現的。
Sqlcommit()
回滾操作
如果您對一個或多個更改不滿意,並且想要完全撤消這些更改,請使用回滾方法。在上面的示例中,這是透過以下命令實現的。
SqlRollback()
Rexx - 手持式和嵌入式程式設計
手持裝置已經發展了很多,Rexx 可以在這些裝置上執行的方式有很多。Rexx 支援 Pocket PC、Palm 裝置、PDA 和其他智慧手機裝置。Rexx 在這些平臺上工作的優勢在於 Rexx 實際上是一個非常輕量級的程式設計系統,僅佔用幾千位元組的空間。因此,在這些裝置上執行 Rexx 程式變得更容易。
手持裝置上的 Rexx 可以以下列模式執行:
第一種模式是本機模式,它直接在作業系統上執行。在這種模式下執行的優勢在於它速度更快,因為它直接從作業系統執行。
下一種模式是在手持裝置上的 DOS 或模擬器程式之上。這種模式的優點是隻要模擬器在該作業系統上執行,它就可以在任何型別的作業系統上執行。
下面顯示了各種手持裝置類別的 Rexx 直譯器。
- Windows CE − Brexx
- Palm OS − Rexx for Palm OS
- Symbian OS − Regina
對於 DOS 模擬器,需要執行以下步驟:
步驟 1 − 首先下載 PocketDOS,這是一個流行的 DOS 模擬器。它設計用於在許多作業系統上執行,並支援常見的 VGA 螢幕以及序列和並行埠。
步驟 2 − 下一步是將 BRexx 檔案(用於 16 位 DOS)下載到 Windows PC。
步驟 3 − 最後一步是使用 ActiveSync 將 Rexx 程式同步到手持裝置。
還有一些其他可用的商業 DOS 產品。XTM 就是屬於此類別的產品。該產品的特點如下:
支援 80186 CPU 和指令集。
它透過 BIOS 程式碼來提高效能。
它可以為 8087 MPU 數學協處理器進行模擬。
它可以訪問序列埠。
它支援多種語言,例如英語、法語和德語。
Rexx - 效能
任何程式語言的關鍵方面之一是應用程式的效能。需要特別注意才能確保應用程式的效能不會受到影響。讓我們按照步驟中描述的一些注意事項來更好地理解:
步驟 1 − 嘗試減少指令數量 – 在 Rexx 中,每條指令都會帶來一定的開銷。因此,嘗試減少程式中的指令數量。下面顯示了一個可以重新設計的指令示例。
與其使用多個 if else 語句,不如使用 parse 語句。因此,在下面的程式中,無需為每個值設定 if 條件,並獲取 word1、word2、word3 和 word4 的值,而是使用 parse 語句。
/* Main program */ parse value 'This is a Tutorial' with word1 word2 word3 word4 say "'"word1"'" say "'"word2"'" say "'"word3"'" say "'"word4"'"
步驟 2 − 嘗試將多個語句合併為一個語句。下面顯示了一個示例。
假設您有以下程式碼,它為a 和 b賦值,並將其傳遞給名為proc的方法。
do i = 1 to 100 a = 0 b = 1 call proc a,b end
您可以使用 parse 語句輕鬆地將上面給出的程式碼替換為以下程式碼。
do i = 1 for 100 parse value 0 1 with a, b, call proc a,b end
步驟 3 − 儘可能用do..for 迴圈替換do..to 迴圈。當控制變數在迴圈中迭代時,通常建議這樣做。
/* Main program */ do i = 1 to 10 say i end
上面的程式應替換為以下程式。
/* Main program */ do i = 1 for 10 say i end
步驟 4 − 如果可能,請從 do 迴圈中刪除 for 條件,如下面的程式所示。如果不需要控制變數,只需在 do 迴圈中放入結束值,如下所示。
/* Main program */ do 10 say hello end
步驟 5 − 在select 子句中,您認為最佳的將要評估的條件需要放在when 子句中的第一位。因此,在下面的示例中,如果我們知道 1 是最頻繁的選項,我們將when 1 子句作為 select 語句中的第一個子句。
/* Main program */ select when 1 then say'1' when 2 then say'2' otherwise say '3' end
Rexx - 最佳程式設計實踐
每個程式設計師都希望他們的程式在質量和效率方面都是最好的。以下是一些編寫 Rexx 程式時的最佳程式設計實踐或技巧,可以幫助您實現這些目標。
技巧 1
在向作業系統或命令提示符發出任何命令之前,請使用 address 命令。這將幫助您預先獲得記憶體中的地址空間,並使您的程式執行更高效。
address 命令示例如下所示。
示例
/* Main program */ address system dir
命令的輸出如下所示,但它可能因系統而異。
Volume in drive H is Apps Volume Serial Number is 8E66-AC3D Directory of H:\ 06/30/2016 01:28 AM <DIR> Apps 07/05/2016 03:40 AM 463 main.class 07/07/2016 01:30 AM 46 main.nrx 07/07/2016 01:42 AM 38 main.rexx 3 File(s) 547 bytes Dir(s) 313,085,173,760 bytes free
技巧 2
確保所有對作業系統的命令都大寫,並在可能的情況下用引號括起來。
同樣的示例如下所示。
示例
/* Main program */
options arexx_bifs
say chdir('\REXXML100')
say directory()
執行上述程式時,我們將得到以下結果。
0 D:\rexxxml100
技巧 3
避免建立大型註釋塊,如下面的程式所示。
示例
/******/ /* */ /* */ /* */ /******/ /* Main program */ address system dir
技巧 4
使用 Parse 語句賦值預設值。同樣的示例如下所示。
示例
parse value 0 1 with a, b
技巧 5
儘可能使用“Left(var1,2)”語句代替“substr(var1,1,2)”語句。
技巧 6
儘可能使用“Right(var1,2)”語句代替“substr(var1,length(var1),2)”語句。
Rexx - 圖形使用者介面
為了使用 Rexx 中可用的圖形使用者介面,需要使用兩個包,一個是ActiveTcl,另一個是Rexxtk包。結合這兩個包,可以設計普通的表單,這些表單可以在表單上包含按鈕和其他控制元件。
環境設定
首先要進行環境設定。讓我們按照以下步驟來設定環境。
步驟 1 − 從以下網站下載 Activetcl 包 − https://www.activestate.com/activetcl
步驟 2 − 下一步是開始安裝 ActiveTCl。點選螢幕上的“下一步”按鈕繼續。
步驟 3 − 接受許可協議,然後點選“下一步”按鈕。
步驟 4 − 選擇安裝位置,然後點選“下一步”按鈕。
步驟 5 − 選擇演示的安裝位置,然後點選“下一步”按鈕。
步驟 6 − 點選“下一步”按鈕繼續安裝。
步驟 7 − 點選“完成”按鈕完成安裝。
步驟 8 − 下一步是從以下連結下載 Rexxtk 軟體 − https://sourceforge.net/projects/rexxtk/
步驟 9 − 雙擊上一步連結中的安裝程式檔案以啟動安裝。點選“下一步”按鈕繼續。
步驟 10 − 在下一個螢幕上,點選“是”按鈕以同意許可協議。
步驟 11 − 在下一個螢幕上,選擇安裝位置,然後點選“下一步”按鈕。
步驟 12 − 選擇程式資料夾位置,然後點選“下一步”按鈕。
安裝完成後,我們現在可以開始在 Rexx 中程式設計 GUI 了。
基本程式
讓我們看看如何在圖形使用者介面格式中使用 Rexx 設計一個簡單的基本程式。
示例
/* Main program */ call RxFuncAdd 'TkLoadFuncs','rexxtk','TkLoadFuncs' call TkLoadFuncs do forever interpret 'Call' TkWait() end call TkDropFuncs exit 0
關於上述程式,需要注意以下幾點:
Rexxtk 庫及其所有函式都使用 RxFuncAdd 命令載入。
do forever 迴圈將保持視窗開啟,並等待使用者輸入。
檢測到使用者輸入後,程式將退出。
執行上述程式後,您將獲得以下輸出。
建立選單
選單是在 TkMenu 和 TkAdd 函式的幫助下建立的。這些函式的語法如下所示。
語法
TkMenu(widgetname,options,0)
引數
Widgetname − 為選單指定一個名稱。
選項可以是以下任何一個 −
selectcolor − 如果使用複選框或單選按鈕作為選單選項,則此選項指定選擇任何選單選項時要選擇的顏色。
tearoff − 此選項用於向主選單新增子選單。
title − 需要用於為視窗指定標題的字串。
返回值
建立選單的控制代碼。
示例
/* Main program */
call RxFuncAdd 'TkLoadFuncs','rexxtk','TkLoadFuncs'
call TkLoadFuncs
menubar = TkMenu('.m1')
filemenu = TkMenu('.m1.file','-tearoff', 0)
call TkAdd menubar, 'cascade', '-label', 'File', '-menu', filemenu
call TkAdd filemenu, 'command', '-label', 'Open...', '-rexx', 'getfile'
call TkConfig '.', '-menu', menubar
do forever
interpret 'Call' TkWait()
end
call TkDropFuncs
exit 0
關於上述程式,需要注意以下幾點:
選單欄是使用 TkMenu 函式建立的。“tearoff”引數意味著我們需要建立將附加到主選單的子選單。
然後,我們使用 TkAdd 函式新增名為“檔案”和“開啟”的兩個選單選項。
執行上述程式後,您將獲得以下輸出。
Rexx - Reginald
Reginald 是另一個由 Jeff Glantt 開發的 Rexx 直譯器,它對如何執行 Rexx 程式有一些自定義設定。在本節中,我們將瞭解如何設定 Reginald 並在其中執行一些 Rexx 程式。
環境設定
第一步是環境設定,即下載 Reginald 檔案。這可以透過以下網站連結完成 − http://www.manmrk.net/tutorials/rexx/Reginald/win32/rxusrw32.htm
下載完成後並啟動安裝程式後,下一個螢幕將允許您選擇安裝位置。
點選“安裝”按鈕繼續。
完成後,我們現在可以開始在 Reginald 直譯器中執行一個示例程式了。建立一個簡單的程式,如下所示。
/* Main program */ say 'Hello'
然後執行以下命令 −
RxLaunch.exe main.rexx
然後您將獲得以下輸出。此程式現在將在 Reginald 直譯器中執行。
其他可用函式
除了普通的 Rexx 命令外,Reginald 還有一些專門為 Windows 作業系統定製的命令。DriveMap 就是這樣的一個命令 −
DriveMap
此函式提供有關驅動器的資訊。
語法:
Drivemap(,options)
引數 −
選項 − 這些是一系列關鍵字,可用於獲取有關本地計算機驅動器的各種資訊。
返回值
包含有關驅動器資訊的字串值。
示例:
/* Main program */ say 'Drives on system : ' DriveMap(,'FIXED')
如果執行上述程式,您將獲得以下輸出。此輸出因系統而異。
List of disk drives : C:\ D:\
Rexx - Web程式設計
Rexx 還可以與 Web 伺服器一起使用。最常見的是 Apache Web 伺服器。為了將 Rexxw 與 Apache Web 伺服器一起使用,您需要首先從以下連結下載 Rexx 模組 − https://sourceforge.net/projects/modrexx/?source=typ_redirect
完成後,請確保將 mod Rexx 模組新增到類路徑。
需要將以下行新增到 Apache 配置檔案中並進行修改。
需要將以下行新增到相應的 −
- httpd.conf LoadModule 列表。
- LoadModule rexx_module modules/mod_rexx.dll
應將以下行新增到http.conf檔案的末尾。
AddType application/x-httpd-rexx-script .rex .rexx
AddType application/x-httpd-rexx-rsp .rsp
新增這些以支援 REXX 伺服器頁面
RexxRspCompiler “c:/Program Files/Apache Group/Apache2/bin/rspcomp.rex”
進行上述更改後,您需要關閉並重新啟動 Apache Web 伺服器。
以上幾行還允許您擁有基於 Rexx 的伺服器頁面,就像 Java 伺服器頁面一樣。您可以將 Rexx 程式碼直接新增到 html 頁面中。
示例如下所示 −
<p>The current date and time is
<?rexx
/* Inserting the rexx statement */
say date() time()
?>
</p>
執行基於 Rexx 的伺服器頁面時,將執行以下操作 −
首先建立一個臨時檔案。
然後,Rexx 伺服器編譯器將檔案編譯成 Rexx 程式,並將其放在臨時檔案中。
下一步是實際執行 Rexx 程式。
最後,刪除臨時檔案。