在IC设计领域,Perl是一种常用的脚本语言,对Perl的学习是有必要的。
本文为根据B站 IC工程师学Perl:Perl 语言基本的语法_哔哩哔哩_bilibili 系列视频的学习笔记。原视频讲解的非常简洁、清晰,推荐看视频学习。本文如有侵权,请联系删除。
一、Perl语言的基本语法
Perl语言名称的由来
比较适合文本的处理
一个最简单Perl语言
第一行指定所在系统Perl解释器的位置
Perl程序不关心空格,所有类型的空格,比如空格、制表符、换行符等,当它们在引号外使用时,对解释器来说都是等效的。
Perl程序中双引号和单引号:双引号中会进行转义(如 \n 打印为换行,$变量打印为变量值),单引号不会
例如,
执行结果为
执行结果为
Perl的标识符(变量名称),以$ @ % 开头,分别表示标量、数组、哈希,后面跟字母、下划线、数字。
注意,Perl区分大小写。
二、数据类型
Perl语言相对语法比较松散,无需为数据指定类型
有三种基本数据类型:
标量:可以是数字、字符串或指针。
数组:是一个有序的列表。
哈希:是一种无序的键/值对集合。
Perl语言中可以不用提前显示声明变量,而直接使用
数组使用的例子:
引用数组中的单个元素,使用 $
哈希是想解决数组内容过大的问题
哈希使用的例子,引用哈希内的值也是使用 $
变量的上下文:数组赋给标量,取的是数组的长度
三、标量
标量是单个数据单元,可以是整数、浮点数、字符、字符串
标量的操作,还是有上下文的概念,如果标量是字符串就进行字符串操作,是数值就进行数值的操作
如果想在程序中引入多行字符串,在定义时需要使用单引号,如果用双引号换行符会被忽略掉
Perl语言的特殊标量,
此外还有输入输出的数组,循环的索引等
四、数组
数组的声明,注意用qw/ /的声明方法
数组的索引从0开始,[0]代表索引第一个元素
数组索引的值可以是负数,[-1]代表索引最后一个元素
数组的切片:数组的某一部分构造新的数组
其中[1..3]称为序列数组。利用这种方法,可以便捷设置连续的数字或字符数组。
比如 @adc = (a..z);为从a连续到z的字符数组。
数组的大小:
把数组赋值给一个标量,这个标量获得的就是这个数组的元素个数
$ size = @ array;
在数组中添加和删除元素:
push,在数组的最后添加一个元素
pop,在数组的最后位置删除一个元素
unshift,在数组的第一个位置添加一个元素
shift,在数组的第一个位置删除一个元素
数组的替换/覆盖
使用splice函数,
将字符串分割为数组
将数组转换为字符串
数组排序
sort函数,根据ASCII大小排序
合并数组
五、哈希
哈希的声明
访问哈希元素
使用花括号
哈希切片
提取键和值
使用keys函数,values函数
检查元素是否存在
获取哈希大小
哈希中添加和删除元素
通过赋值添加;通过delete函数删除
六、条件分支
条件判断中真假的判断
Perl中提供了unless else,跟if的逻辑相反,但是一般不会使用,其功能完全可以用if else实现
另外还提供了switch,有点类似verilog中的case
支持问号表达式 ? :,与verilog中用法相同
七、循环控制
提供了如下的循环语句
与while相比,do while至少会执行一次循环体;
foreach适合于对数组的遍历操作;
until与while的用法想法,满足条件则退出
循环控制语句
next,执行下次循环(类似C语言中的continue),last,退出循环(类似C语言break)
八、运算符
Perl中重要且最常用的运算符包括
算数运算符:加减乘除,取余,乘方
等式运算符,或者关系运算符
如果操作数是数值
如果操作数是字符,根据ASCII码进行比较
比较常用的是 eq 等于,ne 不等于,cmp 比较大小。此外还有 lt 小于,gt 大于,le 小于等于,ge大于等于
赋值运算符
对一个操作数进行操作并赋值回这个操作数本身
位运算符
单个& | ^,与verilog类似
逻辑运算符
与 and 或 &&,或 or 或 ||, 非 not
引用运算符
使用 q{ } 表示 单引号, qq{ } 表示 双引号
其他运算符
*可以用来表示复制几次
++,--,类似C语言中的自加自减
->的索引某个对象里面的某个成员(不是很明白)
九、子程序
划分子程序的一般原则:高内聚、低耦合
一个简单的子程序调用的例子
sub表示这是一个子程序,Hello是子程序名,程序内容用花括号括起来
调用的时候用子程序名就好,调用时的括号可以传递参数
参数的传递
在子程序内部,用@_访问这些传递的参数,@_[0]表示第一个参数,以此类推
返回值默认是最后一行的计算结果
数组的传递
数组需要放在标量的后面
哈希的传递(这里讲的不是很清楚)
子程序中的私有变量
使用my 来定义,其作用范围只在其所在的花括号内。上面哈希传递的例子就使用了my
子程序中的局部变量
当变量的当前值必须对被调用的子程序可见时,使用局部变量,用local声明。
全局变量(state变量)
十、指针
指针是一种标量数据类型,它保存了另一个值的位置,该值可以是标量、数组或哈希。凡是标量可以存在的地方,指针也可以存在,可以构成嵌套的数据结构——指针数组。
创建指针
使用反斜杠,或者利用方括号和花括号
指针的引用
如果不确定变量类型,可以使用ref函数,返回结果为下列之一
函数的指针
使用\&获得
十一、文件操作
与其他很多语言类似,通过将文件句柄与文件相关联,然后通过Perl中自带的函数来进行文件的读写等操作。
打开文件
读文件的不同模式:
注意如果以写入方式打开,文件中原本的内容会被清空
关闭文件
如果赋值给标量,从文件句柄返回第一行
如果赋值给数组,导入所有行
复制文件的例子
重命名文件
删除文件
十二、目录操作
通过一系列标准函数实现
显示一个目录下的所有文件
使用glob函数
此外还有,mkdir 创建一个新目录,rmdir 删除目录等
十三、错误处理
Perl可以用下面的语句检测错误,然后定位
第一种是用if。例如用下面的方法检测文件是否打开成功
warn函数,只是打印消息,并不会终止程序
die函数,打印消息,且终止程序
十四、特别变量
预定义的、具有特殊含义的变量
下面是一个例子。$_ 表示默认输入;常用在循环里面,表示当前次循环的输入
特殊变量的分类
有非常多的特殊变量,在遇到的时候再查询。下面仅仅是一些例子
$_ 默认输入
@ARGV 脚本输入参数列表
%ENV 脚本执行时候的环境变量
STDIN 标准输入 (全局特殊文件句柄)
__FILE__ 程序执行的当前文件 (全局特殊常量)