======================================================================
正则表达式-匹配
1、匹配:m/ /(与qw//操作一样可以使用任何成对的分隔符,如(),<>,{},[],!!,还可以简写为//,略去m)
2、=~ 表示匹配,!~ 表示不匹配。如:if ($string =~ m/RegExp/)
。如果不加=~,则默认对$_进行匹配,如:if (/RegExp/)
3、模式匹配修饰符
修饰符 | 描述 | 用例 |
---|---|---|
i | 忽略大小写 | =~ m/RegExp/i |
s | 多行模式, . 可匹配换行符 | =~ m/Reg.*Exp/s 可匹配 Reg
Exp |
4、正则表达式变量
符号 | 含义 | |
---|---|---|
$` | 匹配部分的前一部分字符串 | |
$& | 匹配的字符串 | |
$' | 还没有匹配的剩余字符串 |
实例:
$string = "welcome to runoob site.";
$string =~ m/runoob/;
print "匹配之前的字符串: $`
";
print "匹配的字符串: $&
";
print "匹配之后的字符串: $'
";
输出:
匹配之前的字符串: welcome to
匹配的字符串: runoob
匹配之后的字符串: site.
5、通配符和量词
表达式 | 描述 | 示例 |
---|---|---|
. | 通配符,匹配除换行符外的所有字符 | |
x? | 匹配 0 次或一次 x 字符串 | |
x* | 匹配 0 次或多次 x 字符串 | |
x+ | 匹配 1 次或多次 x 字符串 | |
.* | 匹配 0 次或多次的任何字符 | |
.+ | 匹配 1 次或多次的任何字符 | |
{m} | 匹配刚好是 m 个 的指定字符串 | (RegExp){3} |
{m,n} | 匹配在 m个 以上 n个 以下 的指定字符串 | (RegExp){1,2} |
{m,} | 匹配 m个 以上 的指定字符串 | (RegExp){2,} |
6、模式中的分组
() | 表示分组 | |
---|---|---|
fred+ | 匹配fredddd | |
(fred)+ | 匹配fredfred |
7、选择符
(|) |
匹配左边的或者右边的 | |
---|---|---|
left( | )+right |
left和right间存在一个或多个空格或制表符 |
8、字符集合
表达式 | 描述 | 示例 |
---|---|---|
[] | 匹配符合 [] 内的字符 | [abc] |
[^] | 匹配不符合 [] 内的字符 | [^abc] |
[0-9] | 匹配所有数字字符 | |
d | 匹配所有数字字符 | |
[^0-9] | 匹配所有非数字字符 | |
[a-z] | 匹配所有小写字母字符 | |
[A-Z] | 匹配所有大写字母字符 | |
w | 字母,数字和下划线 | |
w+ | 匹配单词 | |
s+ | 匹配空白符,等价于[f ],表示格式符、制表符、换行符、回车符以及空格符 |
9、锚位符
表达式 | 描述 | 示例 |
---|---|---|
^ | 匹配字符串开头的字符 | ^RegExp |
$ | 匹配字符串结尾的字符 | RegExp$ |
匹配以英文字母,数字为边界的字符串 | /fred/可以匹配fred,但是不能匹配frederick,“全字匹配” | |
B | 匹配不以英文字母,数值为边界的字符串 | |
^s*$ | 匹配空行 |
10、匹配变量
$string = "left middle, right";
if($string =~ /(left).*(right)/){
print("第一个匹配变量是:$1
");
print("第二个匹配变量是:$2
");
}
======================================================================
正则表达式-替换
1、s/ / /
2、实例:下面的程序将句子中的标点都替换为空格,并将单词存储在数组中
$string = "Hi, I'm Wang Tao. Nice to meet you!";
$string =~ s/[,'.!]/ /g; # 将标点符号替换成空格
$string =~ s/s+/ /g; # 将多个空白符替换成1个空格
print("$string
");
my @array = split(' ',$string);
foreach $value (@array){
print("$value
");
}
======================================================================
数组
https://www.runoob.com/perl/perl-arrays.html
1、Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。
2、数组变量以 @ 开头
3、访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取。
4、创建数组:数组变量以 @ 符号开始,元素放在( )内,也可以以 qw 开始定义数组, 元素放在[]、//、% %等内。
5、数组遍历:一种方式是使用foreach,另一种是使用for加索引
6、数组的基本操作实例:
# ----------------------------------------------------------------
# example 5: 数组基本操作
# ----------------------------------------------------------------
my @array = (1, 2, 3); # 使用@ 和 ()创建,元素间需要加逗号
foreach $value(@array){ # 使用foreach遍历
print("$value
");
}
my @array = qw/1 2 3/; # 使用@ 和 qw/ / 创建,元素间不要加逗号,如果加上逗号会把元素当作:'1,'、'2,'、'3'
foreach $value(@array){
print("$value
");
}
另外,在创建字符串数组时,可采用:
my @array = ("hello", "dog");
my @array = qw(hello dog);
my $size = @array;
print("The size of array is $size
");
for($i=0;$i<$size;$i++){ # 使用for加索引遍历
print("$array[$i]
");
}
7、按序列输出的数组形式,格式为 起始值 + .. + 结束值
# ----------------------------------------------------------------
# example 6: 按序列输出的数组形式,格式为 起始值 + .. + 结束值
# ----------------------------------------------------------------
@array = (1..10);
print("@array
");
8、数组排序:sort @array
9、使用split将字符串转化为数组,使用join将数组转化为字符串。实例:
# ----------------------------------------------------------------
#example 7: 使用split将字符串转化为数组,使用join将数组转化为字符串
# ----------------------------------------------------------------
# 定义字符串
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
# 字符串转为数组
@string = split('-', $var_string);
@names = split(',', $var_names);
print("转成的数组为:
");
print "@string
";
print "@names
";
# 数组转为字符串
print("转成的字符串为:
");
$string1 = join( '-', @string );
$string2 = join( ',', @names );
print "$string1
";
print "$string2
";
10、将文本用push命令放到数组
while(<IN>){
chomp;
push(@in_array,$_);
$line_num++;
print("$_
");
}
print("line_num:$line_num
");
======================================================================
哈希
1、哈希是 key/value 对的集合。
2、Perl中哈希变量以百分号 (%) 标记开始。
3、访问哈希元素格式:${key}
4、判断哈希中某个 key 是否存在可以使用:exists $hash{$key}
5、实例:输入姓,输出名
# ----------------------------------------------------------------
# example 1: 输入姓,输出名
# ----------------------------------------------------------------
%name = ('Li'=>'Fei','Liu'=>'Qiang','Zhang'=>'Ming','Tian'=>'Hua');
while(<STDIN>){
chomp;
if(exists $name{$_}){ # 判断输入的键值是否存在
print("$name{$_}
");
}
else {
print("The input key does not exist!
");
}
}
6、keys 函数会返回此 hash 的所有 keys, values 函数将返回所有的 values。实例:
# ----------------------------------------------------------------
# example 2: 获得哈希所有的键值和value,同时得到其大小
# ----------------------------------------------------------------
my %hash = ("a"=>1,"b"=>2,"c"=>3);
my @k = keys %hash;
my @v = values %hash;
print("keys:@k
");
print("values:@v
");
$size = @k;
print("The size of hash is $size
");
7、使用each或foreach可对hash进行遍历,each %hash
将从 hash 中返回一个 key/value 对。实例:
# ----------------------------------------------------------------
# example 3: 遍历哈希
# ----------------------------------------------------------------
my %hash = ("a"=>1,"b"=>2,"c"=>3);
# each 函数
while(($key,$value) = each %hash){
print("$key=>$value
");
}
# foreach 函数,且使用sort排序
foreach $key (sort keys %hash){
print("$key=>$hash{$key}
");
}
8、增删元素:通过赋值即可增加元素,通过delete即可删除元素。实例:
# ----------------------------------------------------------------
# example 4: 增删元素
# ----------------------------------------------------------------
my %hash = ("a"=>1,"b"=>2,"c"=>3);
$hash{'d'}=4; #增加一个元素d=>4
delete $hash{'a'}; #删除元素a=>1
foreach $key (sort keys %hash){
print("$key=>$hash{$key}
");
}
9、实例
Perl-晶晨2021届笔试题:https://www.cnblogs.com/wt-seu/p/13504324.html
Perl-统计文本中各个单词出现的次数(NVDIA2019笔试):https://www.cnblogs.com/wt-seu/p/12368915.html
其他
各进制数表示
八进制以 0 开头, 十六进制以 0x 开头, 二进制 0b 开头,Perl 允许你使用下划线来区分
Perl-二进制数(补码)转十进制数和十六进制数:https://www.cnblogs.com/wt-seu/p/13534918.html
perl进制转换:https://www.cnblogs.com/blueicely/archive/2013/02/01/2888631.html
数字操作符
加(+), 减(-), 乘(*), 除(/) ,模数运算符(%),次方(**)
转义字符
换行
回车 制表符
字符串操作符
. 用于字符串连接,如“hello”. “world” # 同于 “helloworld”
一些有用的脚本
例化Verilog模块
open(IN,"<","module_head_input.txt") or die "input doesn't exist!";
open(OUT,">","instance_output.txt") or die "output doesn't exist!";
open(OUT2,">","wire_output.txt") or die "output doesn't exist!";
while(<IN>){
chomp;
$line = $_;
if($line=~m/modules+(w*)/){ # module name
print("// --------------- $1 ----------------
");
print(OUT2 "// --------------- $1 ----------------
");
}
elsif($line=~m/(input|output|inout)s+(.*),/){ # input tb_in, input [7:0] tb_in,
print("wire $2;
");
print(OUT2 "wire $2;
");
}
elsif($line=~m/(input|output|inout)s+(.*)/){ # input tb_in_lat ---last input
print("wire $2;
");
print(OUT2 "wire $2;
");
}
elsif($line=~m/^$/){
print("$line
");
print(OUT2 "$line
");
}
}
close IN;
close OUT2;
open(IN,"<","module_head_input.txt") or die "input doesn't exist!";
open(OUT,">","instance_output.txt") or die "output doesn't exist!";
while(<IN>){
chomp;
$line = $_;
if($line=~m/modules+(w*)/){ # module name
print("$1 u_$1
");
print(OUT "$1 u_$1
");
}
elsif($line=~m/(input|output|inout)s*.*s+(w*),/){ # input tb_in, input [7:0] tb_in,
print(" .$2($2),
");
print(OUT " .$2($2),
");
}
elsif($line=~m/(input|output|inout)s*.*s+(w*)/){ # input tb_in_lat ---last input
print(" .$2($2)
");
print(OUT " .$2($2)
");
}
else{
print("$line
");
print(OUT "$line
");
}
}
close IN;
close OUT;