Perl-常用知识点归纳

======================================================================

正则表达式-匹配

1、匹配:m/ /(与qw//操作一样可以使用任何成对的分隔符,如(),<>,{},[],!!,还可以简写为//,略去m)
2、=~ 表示匹配,!~ 表示不匹配。如:if ($string =~ m/RegExp/)。如果不加=~,则默认对$_进行匹配,如:if (/RegExp/)
3、模式匹配修饰符

修饰符 描述 用例
i 忽略大小写 =~ m/RegExp/i
s 多行模式, . 可匹配换行符 =~ m/Reg.*Exp/s 可匹配 Reg\nExp

4、正则表达式变量

符号 含义
$` 匹配部分的前一部分字符串
$& 匹配的字符串
$' 还没有匹配的剩余字符串

实例:

$string = "welcome to runoob site.";
$string =~ m/runoob/;
print "匹配之前的字符串: $`\n";
print "匹配的字符串: $&\n";
print "匹配之后的字符串: $'\n";

输出:

匹配之前的字符串: 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( |\t)+right left和right间存在一个或多个空格或制表符

8、字符集合

表达式 描述 示例
[] 匹配符合 [] 内的字符 [abc]
[^] 匹配不符合 [] 内的字符 [^abc]
[0-9] 匹配所有数字字符
\d 匹配所有数字字符
[^0-9] 匹配所有非数字字符
[a-z] 匹配所有小写字母字符
[A-Z] 匹配所有大写字母字符
\w 字母,数字和下划线
\w+ 匹配单词
\s+ 匹配空白符,等价于[\f\t\n\r ],表示格式符、制表符、换行符、回车符以及空格符

9、锚位符

表达式 描述 示例
^ 匹配字符串开头的字符 ^RegExp
$ | 匹配字符串结尾的字符 | RegExp\$
\b 匹配以英文字母,数字为边界的字符串 /\bfred\b/可以匹配fred,但是不能匹配frederick,“全字匹配”
\B 匹配不以英文字母,数值为边界的字符串
^\s*$ 匹配空行

10、匹配变量

$string = "left middle, right";
if($string =~ /(left).*(right)/){
	print("第一个匹配变量是:$1\n");
	print("第二个匹配变量是:$2\n");
}

======================================================================

正则表达式-替换

1、s/ / /
2、实例:下面的程序将句子中的标点都替换为空格,并将单词存储在数组中

$string = "Hi, I'm Wang Tao. Nice to meet you!";
$string =~ s/[,'.!]/ /g;  # 将标点符号替换成空格
$string =~ s/\s+/ /g; # 将多个空白符替换成1个空格
print("$string\n");
my @array = split(' ',$string);
foreach $value (@array){
		print("$value\n");
}

======================================================================

数组

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\n");
}

my @array = qw/1 2 3/; # 使用@ 和 qw/ / 创建,元素间不要加逗号,如果加上逗号会把元素当作:'1,'、'2,'、'3'
foreach $value(@array){
	print("$value\n");
}
另外,在创建字符串数组时,可采用:
my @array = ("hello", "dog");
my @array = qw(hello dog);

my $size = @array;
print("The size of array is $size\n");
for($i=0;$i<$size;$i++){ # 使用for加索引遍历
	print("$array[$i]\n");
}

7、按序列输出的数组形式,格式为 起始值 + .. + 结束值

# ----------------------------------------------------------------
#  example 6: 按序列输出的数组形式,格式为 起始值 + .. + 结束值
# ----------------------------------------------------------------
@array = (1..10);
print("@array\n");

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("转成的数组为:\n");
print "@string\n";
print "@names\n";
 
# 数组转为字符串
print("转成的字符串为:\n");
$string1 = join( '-', @string );
$string2 = join( ',', @names );
 
print "$string1\n";
print "$string2\n";

10、将文本用push命令放到数组

while(<IN>){
  chomp;
  push(@in_array,$_);
  $line_num++;
  print("$_\n");
}
print("line_num:$line_num\n");

======================================================================

哈希

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{$_}\n");
	}
	else {
		print("The input key does not exist!\n");
	}	
}

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\n");
print("values:@v\n");

$size = @k;
print("The size of hash is $size\n");

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\n");
}

# foreach 函数,且使用sort排序
foreach $key (sort keys %hash){
	print("$key=>$hash{$key}\n");
}

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}\n");
}

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

数字操作符
加(+), 减(-), 乘(*), 除(/) ,模数运算符(%),次方(**)

转义字符
\n 换行 \r 回车 \t 制表符

字符串操作符
. 用于字符串连接,如“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/module\s+(\w*)/){       # module name
    print("// --------------- $1 ----------------\n");
    print(OUT2 "// --------------- $1 ----------------\n");
  }
  
  elsif($line=~m/(input|output|inout)\s+(.*),/){  # input tb_in,  input [7:0] tb_in,
    print("wire $2;\n");
    print(OUT2 "wire $2;\n");    
  }
  
  elsif($line=~m/(input|output|inout)\s+(.*)/){  # input tb_in_lat ---last input
    print("wire $2;\n");
    print(OUT2 "wire $2;\n");    
  }
  
  elsif($line=~m/^$/){
    print("$line\n");
    print(OUT2 "$line\n");
  }
}


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/module\s+(\w*)/){       # module name
    print("$1 u_$1\n");
    print(OUT "$1 u_$1\n");
  }
  
  elsif($line=~m/(input|output|inout)\s*.*\s+(\w*),/){  # input tb_in,  input [7:0] tb_in,
    print("\t.$2($2),\n");
    print(OUT "\t.$2($2),\n");    
  }
  
  elsif($line=~m/(input|output|inout)\s*.*\s+(\w*)/){  # input tb_in_lat ---last input
    print("\t.$2($2)\n");
    print(OUT "\t.$2($2)\n");  
  }

  else{
    print("$line\n");
    print(OUT "$line\n");
  }
}

close IN;
close OUT;

posted @ 2020-06-11 10:06  笑着刻印在那一张泛黄  阅读(306)  评论(0)    收藏  举报