加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

IC脚本之数组 | 从Shell到Tcl到Perl

2022/12/27
3773
阅读需 11 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1Shell数组

shell中的数组是一个比较特殊的存在。因为在shell中定义变量时总是默认就被定义为数组类型变量。除非我们使用declare命令显式指定变量为其它类型。

换句话说,shell中的数组其实就是多个普通变量的组合而已。事实也确实如此,对数组的大多数操作方式在普通变量中同样有效。

 

1.1创建数组

 

1.1.1直接创建

与创建普通变量一样,直接使用=赋值即可。如:

以下是一个示例程序:

该程序创建了一个名为 array 的数组,该数组拥有 3 个元素内容。与传统编程语言一样,shell中的数组的起始下标也是0。不过,与传统编程语言不一样的地方是:shell中的数组允许“跳跃式创建”。一般的编程语言里,甚至在我们的潜意识里,都认为数组的创建及赋值必须是按顺序来的,先把前面的槽位用值填上了才可继续后面的填充。但shell却可以跳跃着来填值。以下是一个shell数组跳跃式创建的示例程序:

该程序是完全合法的。这样创建出来的数组其实内部只有 3 个元素,只不过它们的位置确实是在 1 号、3号及10号而已。中间其它下标的值为空。

另外,同样可以使用 declare 命令显式创建数组,语法如下:

1.1.2使用元组创建

使用元组创建数组与直接赋值创建相比唯一的区别就是:可以严格按照顺序来填充值。以下是语法示例:

1.1.3创建关联数组

shell中的关联数组其实就是一种映射集合的关系。简单说,它允许我们自定义数组中的索引下标的值,将传统的 0 1 2 3 4 索引下标替换成任意字符串以方便使用 array[key] 的方式查找元素值。以下是关联数组创建的语法示例:

以上程序使得后续可以在数组的索引中传入对应的字符串型下标来查找对应的元素值,这本质上就是一个key-value对形式的映射集合了,已经有点超越了普通数组的范畴了。不过,关联数组是一个后来才出现的功能。使用关联数组前必须先以-A参数显式声明数组变量,且运行shell脚本代码的bash的版本不得低于4.0。

 

1.2获取数组长度

 

1.3获取数据列表

 

 

1.4读取某下标赋值

 

 

1.5数组遍历

 

 

1.6数组切片

 

 

1.7数组替换

 

 

1.8数组删除

 

 

1.9追加数组元素

 

 

1.10向函数传数组参数

 

2Tcl

 

2.1创建数组

 

数组是一组使用索引对应元素的排列方式。常规数组的语法如下所示。

用于创建简单数组的例子,如下所示。

当上述代码被执行时,它会产生以下结果。

 

2.2数组大小

 

用于计算数组大小的语法,如下所示。

用于打印数组的大小的示例如下所示。

当上述代码被执行时,它会产生以下结果。

 

2.3数组迭代

 

虽然数组索引可以是非连续的,像索引1,然后索引10等指定的值。但是如果它们是连续的,我们可以用数组迭代访问数组的元素。一个简单的数组迭代的打印元素,如下所示。

当上述代码被执行时,它会产生以下结果。

 

2.4关联数组

 

在TCL,所有数组本质是相关联的。数组存储并没有任何具体的顺序进行检索。关联数组使用索引但不一定都是数字。一个简单的例子,关联数组与非数字索引如下所示。

当上述代码被执行时,它会产生以下结果。

 

2.5数组的索引

 

用于检索数组索引的语法如下所示。

用于打印数组的大小的示例如下所示。

当上述代码被执行时,它会产生以下结果。

 

 

2.6多维数组

 

在有些时候,可能需要象 C 语言这样:

来定义一个多维数组来处理数据。Tcl 并没有直接支持这种数组的格式,使用者自己可以定义所谓的多维数组,如:

 

由于 Tcl 数组索引的灵活性,使用时要小心,否则可能得不到预期的结果,如忘记了上面索引的逗号,就成了:

 

 

2.7数组操作指令

 

array get 命令

array get 命令提取数组索引、元素值对并将这些值对组织成一个列表。而 array  set 命令 则将一个列表(数据要成对)转换成一个数组。例

 

array names命令

array names 返回所有元素索引名与模式 pattern 匹配的元素索引名列表。模式 pattern 和 string match 的模式格式相同。如果 pattern 没有指定,则返回所有数组元素索引名列表。

 

3Perl

Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。数组变量以 @ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:

程序中 $ 符号使用了  来转义,让他原样输出。

执行以上程序,输出结果为:

 

3.1创建数组

 

数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组。

第二个数组使用 qw// 运算符,它返回字符串列表,数组元素以空格分隔。当然也可以使用多行来定义数组:

你也可以按索引来给数组赋值,如下所示:

 

3.2访问数组元素

 

访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:

执行以上程序,输出结果为:

数组索引值从 0 开始,即 0 为第一个元素,1 为第二个元素,以此类推。负数从反向开始读取,-1 为第一个元素, -2 为第二个元素。

 

 

3.3数组序列号

 

Perl 提供了可以按序列输出的数组形式,格式为 起始值 + .. + 结束值,实例如下:

执行以上程序,输出结果为:

 

3.4数组大小

 

数组大小由数组中的标量上下文决定:

执行以上程序,输出结果为:

数组长度返回的是数组物理大小,而不是元素的个数,我们可以看以下实例:

执行以上程序,输出结果为:

从输出的结果可以看出,数组元素只有四个,但是数组大小为 51。

 

3.5添加和删除数组元素

 

Perl 提供了一些有用的函数来添加和删除数组元素。如果你之前没有编程经验,可能会问什么是函数,其实我们之前使用的 print 即是一个输出函数。下表列出了数组中常用的操作函数:

执行以上程序,输出结果为:

 

3.6切割数组

 

我们可以切割一个数组,并返回切割后的新数组:

执行以上程序,输出结果为:

数组索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。如果是连续的索引,可以使用 .. 来表示指定范围:

执行以上程序,输出结果为:

 

3.7替换数组元素

 

Perl 中数组元素替换使用 splice() 函数,语法格式如下:

参数说明:

@ARRAY:要替换的数组。

OFFSET:起始位置。

LENGTH:替换的元素个数。

LIST:替换元素列表。

以下实例从第6个元素开始替换数组中的5个元素:

执行以上程序,输出结果为:

 

3.8将字符串转换为数组

 

Perl 中将字符串转换为数组使用 split() 函数,语法格式如下:

参数说明:

PATTERN:分隔符,默认为空格。

EXPR:指定字符串数。

LIMIT:如果指定该参数,则返回该数组的元素个数。

执行以上程序,输出结果为:

 

3.9将数组转换为字符串

 

Perl 中将数组转换为字符串使用 join() 函数,语法格式如下:

参数说明:

EXPR:连接符。

LIST:列表或数组。

执行以上程序,输出结果为:

3.10数组排序

 

Perl 中数组排序使用 sort() 函数,语法格式如下:

参数说明:

SUBROUTINE:指定规则。

LIST:列表或数组。

执行以上程序,输出结果为:

注意:数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。

3.11特殊变量:$[

 

特殊变量 $[ 表示数组的第一索引值,一般都为 0 ,如果我们将 $[ 设置为 1,则数组的第一个索引值即为 1,第二个为 2,以此类推。实例如下:

执行以上程序,输出结果为:

一般情况我们不建议使用特殊变量 $[,在新版 Perl 中,该变量已废弃。

 

3.12合并数组

 

数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下所示:

执行以上程序,输出结果为:

也可以在数组中嵌入多个数组,并合并到主数组中:

执行以上程序,输出结果为:

 

3.13从列表中选择元素

 

一个列表可以当作一个数组使用,在列表后指定索引值可以读取指定的元素,如下所示:

执行以上程序,输出结果为:

同样我们可以在数组中使用 .. 来读取指定范围的元素:

执行以上程序,输出结果为:

相关推荐

电子产业图谱

前华为海思工程师;与非网2022年度影响力创作者;IC技术圈成员。

微信公众号