加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

IC腳本之?dāng)?shù)組 | 從Shell到Tcl到Perl

2022/12/27
3526
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1Shell數(shù)組

shell中的數(shù)組是一個(gè)比較特殊的存在。因?yàn)樵趕hell中定義變量時(shí)總是默認(rèn)就被定義為數(shù)組類型變量。除非我們使用declare命令顯式指定變量為其它類型。

換句話說,shell中的數(shù)組其實(shí)就是多個(gè)普通變量的組合而已。事實(shí)也確實(shí)如此,對(duì)數(shù)組的大多數(shù)操作方式在普通變量中同樣有效。

 

1.1創(chuàng)建數(shù)組

 

1.1.1直接創(chuàng)建

與創(chuàng)建普通變量一樣,直接使用=賦值即可。如:

以下是一個(gè)示例程序:

該程序創(chuàng)建了一個(gè)名為 array 的數(shù)組,該數(shù)組擁有 3 個(gè)元素內(nèi)容。與傳統(tǒng)編程語言一樣,shell中的數(shù)組的起始下標(biāo)也是0。不過,與傳統(tǒng)編程語言不一樣的地方是:shell中的數(shù)組允許“跳躍式創(chuàng)建”。一般的編程語言里,甚至在我們的潛意識(shí)里,都認(rèn)為數(shù)組的創(chuàng)建及賦值必須是按順序來的,先把前面的槽位用值填上了才可繼續(xù)后面的填充。但shell卻可以跳躍著來填值。以下是一個(gè)shell數(shù)組跳躍式創(chuàng)建的示例程序:

該程序是完全合法的。這樣創(chuàng)建出來的數(shù)組其實(shí)內(nèi)部只有 3 個(gè)元素,只不過它們的位置確實(shí)是在 1 號(hào)、3號(hào)及10號(hào)而已。中間其它下標(biāo)的值為空。

另外,同樣可以使用 declare 命令顯式創(chuàng)建數(shù)組,語法如下:

1.1.2使用元組創(chuàng)建

使用元組創(chuàng)建數(shù)組與直接賦值創(chuàng)建相比唯一的區(qū)別就是:可以嚴(yán)格按照順序來填充值。以下是語法示例:

1.1.3創(chuàng)建關(guān)聯(lián)數(shù)組

shell中的關(guān)聯(lián)數(shù)組其實(shí)就是一種映射集合的關(guān)系。簡單說,它允許我們自定義數(shù)組中的索引下標(biāo)的值,將傳統(tǒng)的 0 1 2 3 4 索引下標(biāo)替換成任意字符串以方便使用 array[key] 的方式查找元素值。以下是關(guān)聯(lián)數(shù)組創(chuàng)建的語法示例:

以上程序使得后續(xù)可以在數(shù)組的索引中傳入對(duì)應(yīng)的字符串型下標(biāo)來查找對(duì)應(yīng)的元素值,這本質(zhì)上就是一個(gè)key-value對(duì)形式的映射集合了,已經(jīng)有點(diǎn)超越了普通數(shù)組的范疇了。不過,關(guān)聯(lián)數(shù)組是一個(gè)后來才出現(xiàn)的功能。使用關(guān)聯(lián)數(shù)組前必須先以-A參數(shù)顯式聲明數(shù)組變量,且運(yùn)行shell腳本代碼的bash的版本不得低于4.0。

 

1.2獲取數(shù)組長度

 

1.3獲取數(shù)據(jù)列表

 

 

1.4讀取某下標(biāo)賦值

 

 

1.5數(shù)組遍歷

 

 

1.6數(shù)組切片

 

 

1.7數(shù)組替換

 

 

1.8數(shù)組刪除

 

 

1.9追加數(shù)組元素

 

 

1.10向函數(shù)傳數(shù)組參數(shù)

 

2Tcl

 

2.1創(chuàng)建數(shù)組

 

數(shù)組是一組使用索引對(duì)應(yīng)元素的排列方式。常規(guī)數(shù)組的語法如下所示。

用于創(chuàng)建簡單數(shù)組的例子,如下所示。

當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。

 

2.2數(shù)組大小

 

用于計(jì)算數(shù)組大小的語法,如下所示。

用于打印數(shù)組的大小的示例如下所示。

當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。

 

2.3數(shù)組迭代

 

雖然數(shù)組索引可以是非連續(xù)的,像索引1,然后索引10等指定的值。但是如果它們是連續(xù)的,我們可以用數(shù)組迭代訪問數(shù)組的元素。一個(gè)簡單的數(shù)組迭代的打印元素,如下所示。

當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。

 

2.4關(guān)聯(lián)數(shù)組

 

在TCL,所有數(shù)組本質(zhì)是相關(guān)聯(lián)的。數(shù)組存儲(chǔ)并沒有任何具體的順序進(jìn)行檢索。關(guān)聯(lián)數(shù)組使用索引但不一定都是數(shù)字。一個(gè)簡單的例子,關(guān)聯(lián)數(shù)組與非數(shù)字索引如下所示。

當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。

 

2.5數(shù)組的索引

 

用于檢索數(shù)組索引的語法如下所示。

用于打印數(shù)組的大小的示例如下所示。

當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。

 

 

2.6多維數(shù)組

 

在有些時(shí)候,可能需要象 C 語言這樣:

來定義一個(gè)多維數(shù)組來處理數(shù)據(jù)。Tcl 并沒有直接支持這種數(shù)組的格式,使用者自己可以定義所謂的多維數(shù)組,如:

 

由于 Tcl 數(shù)組索引的靈活性,使用時(shí)要小心,否則可能得不到預(yù)期的結(jié)果,如忘記了上面索引的逗號(hào),就成了:

 

 

2.7數(shù)組操作指令

 

array get?命令

array get 命令提取數(shù)組索引、元素值對(duì)并將這些值對(duì)組織成一個(gè)列表。而 array ?set 命令?則將一個(gè)列表(數(shù)據(jù)要成對(duì))轉(zhuǎn)換成一個(gè)數(shù)組。例

 

array names命令

array names 返回所有元素索引名與模式 pattern 匹配的元素索引名列表。模式 pattern 和 string match 的模式格式相同。如果 pattern 沒有指定,則返回所有數(shù)組元素索引名列表。

 

3Perl

Perl 數(shù)組一個(gè)是存儲(chǔ)標(biāo)量值的列表變量,變量可以是不同類型。數(shù)組變量以?@?開頭。訪問數(shù)組元素使用?$ +?變量名稱?+ [索引值]?格式來讀取,實(shí)例如下:

程序中?$?符號(hào)使用了??來轉(zhuǎn)義,讓他原樣輸出。

執(zhí)行以上程序,輸出結(jié)果為:

 

3.1創(chuàng)建數(shù)組

 

數(shù)組變量以?@?符號(hào)開始,元素放在括號(hào)內(nèi),也可以以 qw 開始定義數(shù)組。

第二個(gè)數(shù)組使用 qw//?運(yùn)算符,它返回字符串列表,數(shù)組元素以空格分隔。當(dāng)然也可以使用多行來定義數(shù)組:

你也可以按索引來給數(shù)組賦值,如下所示:

 

3.2訪問數(shù)組元素

 

訪問數(shù)組元素使用?$ +?變量名稱?+ [索引值]?格式來讀取,實(shí)例如下:

執(zhí)行以上程序,輸出結(jié)果為:

數(shù)組索引值從?0?開始,即?0?為第一個(gè)元素,1 為第二個(gè)元素,以此類推。負(fù)數(shù)從反向開始讀取,-1 為第一個(gè)元素,?-2 為第二個(gè)元素。

 

 

3.3數(shù)組序列號(hào)

 

Perl 提供了可以按序列輸出的數(shù)組形式,格式為?起始值?+ .. +?結(jié)束值,實(shí)例如下:

執(zhí)行以上程序,輸出結(jié)果為:

 

3.4數(shù)組大小

 

數(shù)組大小由數(shù)組中的標(biāo)量上下文決定:

執(zhí)行以上程序,輸出結(jié)果為:

數(shù)組長度返回的是數(shù)組物理大小,而不是元素的個(gè)數(shù),我們可以看以下實(shí)例:

執(zhí)行以上程序,輸出結(jié)果為:

從輸出的結(jié)果可以看出,數(shù)組元素只有四個(gè),但是數(shù)組大小為 51。

 

3.5添加和刪除數(shù)組元素

 

Perl 提供了一些有用的函數(shù)來添加和刪除數(shù)組元素。如果你之前沒有編程經(jīng)驗(yàn),可能會(huì)問什么是函數(shù),其實(shí)我們之前使用的 print 即是一個(gè)輸出函數(shù)。下表列出了數(shù)組中常用的操作函數(shù):

執(zhí)行以上程序,輸出結(jié)果為:

 

3.6切割數(shù)組

 

我們可以切割一個(gè)數(shù)組,并返回切割后的新數(shù)組:

執(zhí)行以上程序,輸出結(jié)果為:

數(shù)組索引需要指定有效的索引值,可以是正數(shù)后負(fù)數(shù),每個(gè)索引值使用逗號(hào)隔開。如果是連續(xù)的索引,可以使用 .. 來表示指定范圍:

執(zhí)行以上程序,輸出結(jié)果為:

 

3.7替換數(shù)組元素

 

Perl 中數(shù)組元素替換使用 splice()?函數(shù),語法格式如下:

參數(shù)說明:

?@ARRAY:要替換的數(shù)組。

?OFFSET:起始位置。

?LENGTH:替換的元素個(gè)數(shù)。

?LIST:替換元素列表。

以下實(shí)例從第6個(gè)元素開始替換數(shù)組中的5個(gè)元素:

執(zhí)行以上程序,輸出結(jié)果為:

 

3.8將字符串轉(zhuǎn)換為數(shù)組

 

Perl 中將字符串轉(zhuǎn)換為數(shù)組使用 split()?函數(shù),語法格式如下:

參數(shù)說明:

?PATTERN:分隔符,默認(rèn)為空格。

?EXPR:指定字符串?dāng)?shù)。

?LIMIT:如果指定該參數(shù),則返回該數(shù)組的元素個(gè)數(shù)。

執(zhí)行以上程序,輸出結(jié)果為:

 

3.9將數(shù)組轉(zhuǎn)換為字符串

 

Perl 中將數(shù)組轉(zhuǎn)換為字符串使用 join()?函數(shù),語法格式如下:

參數(shù)說明:

?EXPR:連接符。

?LIST:列表或數(shù)組。

執(zhí)行以上程序,輸出結(jié)果為:

3.10數(shù)組排序

 

Perl 中數(shù)組排序使用 sort() 函數(shù),語法格式如下:

參數(shù)說明:

?SUBROUTINE:指定規(guī)則。

?LIST:列表或數(shù)組。

執(zhí)行以上程序,輸出結(jié)果為:

注意:數(shù)組排序是根據(jù) ASCII 數(shù)字值來排序。所以我們?cè)趯?duì)數(shù)組進(jìn)行排序時(shí)最好先將每個(gè)元素轉(zhuǎn)換為小寫后再排序。

3.11特殊變量:$[

 

特殊變量?$[?表示數(shù)組的第一索引值,一般都為 0 ,如果我們將?$[?設(shè)置為 1,則數(shù)組的第一個(gè)索引值即為 1,第二個(gè)為 2,以此類推。實(shí)例如下:

執(zhí)行以上程序,輸出結(jié)果為:

一般情況我們不建議使用特殊變量?$[,在新版 Perl 中,該變量已廢棄。

 

3.12合并數(shù)組

 

數(shù)組的元素是以逗號(hào)來分割,我們也可以使用逗號(hào)來合并數(shù)組,如下所示:

執(zhí)行以上程序,輸出結(jié)果為:

也可以在數(shù)組中嵌入多個(gè)數(shù)組,并合并到主數(shù)組中:

執(zhí)行以上程序,輸出結(jié)果為:

 

3.13從列表中選擇元素

 

一個(gè)列表可以當(dāng)作一個(gè)數(shù)組使用,在列表后指定索引值可以讀取指定的元素,如下所示:

執(zhí)行以上程序,輸出結(jié)果為:

同樣我們可以在數(shù)組中使用 .. 來讀取指定范圍的元素:

執(zhí)行以上程序,輸出結(jié)果為:

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

前華為海思工程師;與非網(wǎng)2022年度影響力創(chuàng)作者;IC技術(shù)圈成員。

微信公眾號(hào)