Perl脚本 — 数字IC验证


👉 perl中使用正则表达式进行匹配:正则表达式
👉 解析register表格:perl脚本解析 register 表格


一、基本语法

1.1 标量

    Perl中两个最基本的变量,即标量和列表。标量可以是数字和字符串。

1.1.1 数字

数字的类型包含如下:

类型描述
整数如:122222 或 12_2222 ,允许下划线进行连接。
浮点数如:345.25 ;1.25e5 ,其中 e 为10的指数。
非十进制整数0225 ,0开头表示 8 进制;
0xff ,0x开头表示16进制;
0b1011_0000,0b开头表示二进制;

数字之间的比较,如:>、>=、>>、==、!=。

1.1.2 字符串

字符串分为单引号字符串和双引号字符串,其含义是不同的。
    1)双引号字符串支持变量的内插;
    2)双引号字符串中反斜线 \ 表示转移字符,其含义包括:

类型描述
\转移字符,如$ 为$字符 ,"表示 " 。  
注意:这里单引号字符串的用法相同。
\n换行 。  
注意:单引号字符串中,\n 没有换行的含义,就只是单纯的 \n 字符串含义。
\r回车
\t制表符,Tab
\U接着的字符均大写,直到 \E 出现
\u下一个字符大写
\L接着的字符均小写,直到 \E 出现
\l下一个字符小写
\E结束\U、\L

常用的字符串操作符包括:
    1)拼接操作符 “.” ,将字符串拼接起来。如"who".“are”.“you?\n” ,等价于"who are you?\n" 。
    2)重复操作符“x”,如 “ab"x3 ,等价于"ababab” 。

字符串的比较操作符,如下:

1.1.3 标量的定义

    标量以 $ 符号开头,后面接 Perl 标志符。标志符由字符、数字、下划线组成,必须以字母或下划线开头。注意避开Perl中的一些特殊内置变量,如:

变量描述
$ARGV指定命令行参数。
$_默认输入和模式匹配的内容,即如果不指定接受输入的变量或执行模式匹配的字符串时,默认为这个变量。
$n包括$1、$2、… ,匹配的第n个字符串
$$运行当前Perl 脚本程序的进程号
$@命令eval的错误消息,如果为空,则表示上一次eval 命令执行成功。
$?存放进程结束的状态。
@_传给子程序的参数列表。
@ARGV传给Perl 脚本的命令行参数列表。
@INC导入模块时需要搜索的目录,告诉Perl去哪个目录下去找这些导入的模块。
$"如 $" = “,”,将字符串的内参空格变成逗号“,” 。
$#在数组中,表示数组的最大索引

1.1.4 标量的赋值

    常见的方式包括:

my $value = 10;
$value = $value + 100; 
# 等价于
$value += 100; 

用 my的方式声明一个变量。在Perl 中使用 use strict时,变量就必须要用 my的方式声明。

my $str = "little";
$str = $str."verifier"; 
# 等价于
$str .= "verifier"; 

1.2 列表与数组

1.2.1 定义列表与数组

数组和列表的区分其实没有那么严格,如下,分别创建数组和列表:

# 数组
$arr[0] = "little";
$arr[1] = "verifier";
$arr[2] = undef;
($arr[0],$arr[1],$arr[2]) = ("little","verifier"); #等价于上面三行代码

#列表或数组
@array = ("little","verifier"); 

#列表 
($str1,$str2,$str3) = ("little","verifier",undef); # 三个字符串标量组成的列表

print @arr;     # 输出: littleverifier
print @array;   # 输出: littleverifier
print "@arr";   # 输出: little verifier
print "@array"; # 输出: little verifier ,字符串的内参包含一个空格符号

注意:

  • 如果用了索引,那就要用美元 $ 符号;
  • 如果对数组整体做操作,就要用 @ 符号;
  • print "@array"的方式,字符串内参会在每个元素之间加一个空格。
  • 如果数组或列表的对应位置没有标量,那就默认是undef。

1.2.2 数组的索引

遍历数组,如下:

@array = ("little","verifier");
$array[10] = "strong";  # 中间空的索引默认会为 undef
$" = "," ;  # 将字符串的内参空格变成逗号“,” 。

print "@array";   #输出: little,verifier,,,,,,,,,strong
print $array[$#array]; #输出: strong
print $array[1];  #输出: verifier
print $array[2];  #输出: undef
print $array[-1]; #输出: strong

注意:

  • $" = “,” ,将字符串的内参空格变成逗号“,” 。
  • 索引 $#array 和 -1 都表示最后一个索引,同理 -2 表示倒数第二个。

1.2.3 关于 qw 的使用

使用qw来简化产生一个数组,如下:

@arr = qw \ \; # 空的数组
@arr1 =  qw(little verifier); #相当于 @arr1 = ("little","verifier");

注意:

  • qw可以使用各种符号,如!# \ {}…,但注意必须是成对的。

1.2.4 关于$_的使用

先看下面几种等价的遍历方式,其输出结果都是相同的。如下:

@str =  qw /aaa bbb ccc ddd eee /; 
foreach $str (@str){  # @str代表待遍历的的数组
	print $str."/n";  # $str代表每个循环的变量
}
@str =  qw /aaa bbb ccc ddd eee /; 
foreach (@str){   #省略变量不写
	print $_."/n";	
}

从上面可以看出,$_是一个默认的变量

1.2.5 数组的存取

常用的操作符,如下:

操作符描述例子
pop从末端取出,即索引最大值处$str = pop(@arr);
push从最末端存入push(@arr,0); #向数组中存入0
push@arr,0; #可以省略括号;
push@arr,0..10 ; # 存入一个列表0~10
shift从首端取出,即索引值的最小值处$str = shift@arr;
unshift从首端存入unshift @arr,@str; #添加一个数组str到数组arr中
reverse将元素反序后存到另一个变量中,效果即123变321。$str = reverse(@arr);
$arr = reverse@arr; #将原来arr数组反序
sort按照ASCI码顺序从小到大排序@num = qw/ 1 10 2 20 9 /
@out = sort @num; # 输出是 1 10 2 20 9
@out = reverse sort @num; # 输出是 9 20 2 10 1

1.3 上下文

    上下文环境咋Perl中是很重要的,且具有很强迷惑性。如下:
情况一:

@str = qw/ little verifier /
@sorted = sort @str;  

解释上面代码:@str是一个数组或列表,那么@sorted所在的的上下文就是一个数组或列表上下文

情况二:

@str = qw/ little verifier /
$num = 42 + @str;  # 输出:44 ,42 + 2 = 44

解释上面代码:

  • 42是一个标量,$num是一个标量,那么这个上下文就是标量上下文,所以@str就必须是一个标量。
  • 当数组或列表变成标量时,即其含有几个元素。这里@str的标量是2 。

情况三:

@str = qw/ aabb ccdd /
@out1 = reverse @str;  #列表上下文,输出:ccdd aabb
$out2 = reverse @str;  #标量上下文,输出:ddccbbaa

解释上面代码:当列表或数组变为标量时,会将所有元素变成一个字符串。

情况四:

@str = qw/ little verifier /
print scalar @str ; 输出:2

解释上面代码:scalar 可以将数组或列表变成一个标量,数组变成标量时即为数组中的元素个数。

情况五:

$line = <STDIN>;  # 标量上下文,可以输入一行
chomp (@arr  = <STDIN>);  # 列表上下文,可以输入多行

print "$line\n";
print "@arr\n";

解释上面代码:

  • <STDIN> 是键盘输入的操作符,可以接收键盘输入的一行内容
  • chomp 可以将字符串中的换行符去掉。

1.4 子程序

1.4.1 定义子程序

my @sheet = qw / /; # 定义一个空数组
my $id = 0;

sub parse_ods{      # 定义子程序
	my $para = 8;   # 子程序的私有变量
	$sheet[$id] = $para * $id ; # 给 @sheet 赋值
	$id += 1;   		# 返回值,相当于return $id++ 
}

$temp = &parse_ods; # 调用子程序

注:用“&+子程序名”的方式去调用子程序是表示只调用我自己定义的子程序,不去调用预定义好的子程序。

1.4.2 传递参数

默认参数:@_ 。Perl会将子程序调用时的参数默认存放在 @_ 数组中,可以通过 $_[0] , $_[1] ,… ,$_[n] 来访问第一个参数、第二个参数、…第n个参数。如下:

use strict; 		# 告诉Perl用严格的方式编译,所有的变量必须要用my明确声明,防止写错。

sub parse_xml{   
	print $_[0] ;   # 输出:10
	print "@_" ;	# 输出:10verifier
}

sub out_xml1{
	my($frt,$sec) = @_;  # 声明两个局部变量来接受传递的参数
	print $frt ;   # 输出:10
	print $sec ;   # 输出:verifier
}

sub out_xml2{
	foreach (@_) {
		print $_;  # $_是遍历@_时产生的变量
	}   
}

&parse_xml(10,"verifier"); #调用时传递两个参数
&out_xml1(10,"verifier"); 
&out_xml2(10,"verifier"); 

1.4.3 静态变量

子程序中也可以声明静态变量,如下:

use strict;

sub state_test{
	state $num = 1;
	$num += 1;
	print $num; #每调用一次这个子程序, $num 就加1
}

&state_test;

二、输出

这里常用的输入和输出(如print 和printf)就不提了,主要侧重于文件句柄的使用。如下:

2.1 读取文件

open SRC_FILE,"<","chip_reg.ods" ;
#注意:旧版本还可以写成 open SRC_FILE,"<chip_reg.ods" ; 的形式

while(<SRC_FILE>){
	print $_;
}
close SRC_FILE;

open 操作时是有返回值得,成功返回1,失败返回0。如下:

if(!open SRC_FILE,"<","chip_reg.ods") {die "OPEN  failed : $! /n" };
close SRC_FILE;

2.2 输出文件

open DEST_FILE,">","my_trans.sv" ; # 如果文件不存在会自动地创建
print DEST_FILE "hello world!\n";
close DEST_FILE;

如果要继续在文件中追加内容,要用 >> 符号。如果继续用 > 符号会覆盖原先的内容。如下;

open DEST_FILE,">>","my_trans.sv" ; # 如果文件不存在会自动地创建
print DEST_FILE "hello little verifier!\n";
close DEST_FILE;

三、哈希(hash)

哈希就是一个键值对,一个键(key)对应一个值(value),根据键可以索引值。这里的值可以是数组,也可以是标量。如下:

$score {"zhangsan"} = 1;
$score {"lisi"}     = "shazi";

print $score{"zhangsan"}; # 输出:1
print $score{"lisi"};     # 输出:shazi

哈希的赋值方式,还可以如下:

%score = ("zhangsan",1."lisi","shazi");
%score = ("zhangsan" => 1,"lisi" => "shazi");

3.1 常用的 hash 操作

操作符描述例子
keys返回哈希中的所有键的数组my @k = keys %hash # 列表上下文,返回hash中的所有键
my $k = keys %hash # 标量上下文,返回hash中的所有键的个数
reverse将 key 变成 value ,value 变成 keymy %k = reverse %hash
each从hash中取一对数据(key value)出来while( ($key,$value) = each %hash ) { ...}
exists检查hash中的某个key是否存在对应的valueif ( exists $hash{"zhangsan"}) { ...}
delete根据key,删除该键值对delete $hash{"zhangsan"};

3.2 特殊的 hash

%ENV 是一个存储环境变量的特殊 hash 。如:

print "$ENV{PATH}\n";
  • 6
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值