文章目录
👉 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 变成 key | my %k = reverse %hash |
each | 从hash中取一对数据(key value)出来 | while( ($key,$value) = each %hash ) { ...} |
exists | 检查hash中的某个key是否存在对应的value | if ( exists $hash{"zhangsan"}) { ...} |
delete | 根据key,删除该键值对 | delete $hash{"zhangsan"}; |
3.2 特殊的 hash
%ENV 是一个存储环境变量的特殊 hash 。如:
print "$ENV{PATH}\n";