数字IC验证:Perl快速入门

写在前面:
最近实习需要学习perl的基础知识,由于目前只需要了解perl基本语法,看懂即可,不做深入学习,因此写下本文,用于Perl快速入门。

内容主要来源:CSDN@David_Berkdong 《Perl与Python之间的一些异同

1 Perl的基本数据类型

Perl 支持的基本数据类型包括:标量、数组、哈希。分别用 $、@、% 定义。

  1. 标量 (scalar):用 $ 定义,大多数标量由数字字符串组成:数字类型如整数、浮点数等;字符串有单引号和双引号内两种形式,对长度没有限制。两者的区别在于在单引号内 \n 不代表换行,而代表反斜线和 n 这两个字符,双引号内字符串则可以通过反斜线进行转义。字符串的操作符有 . 拼接操作符和 x 重复操作符等。
  2. 数组 (Arrays):用 @ 定义,如 my @array=(“a”,“b”,“c”,“d”); 访问数组的元素用 $array[1]。在 perl 中,数组也可以当做堆栈来处理,支持的操作符包括 pop 和 push,shft 和 unshift。两组操作的区别在于前者对数组的尾部进行处理,而 shift 和 unshift 则针对数组的头部进行处理。pop 得到的是数组的最后一个元素,如 pop(@array)= d,如果数组为空,则返回 undef。而 shift(@array)=a。
  3. 哈希:也称作关联数组,用 % 定义。是根据关键码值 (Key value) 而直接进行访问的数据结构。如 %my_hash=(“key1”=>”23”,”name”=>”zhang”,”age”=>”24”),其中键以字符串表示,Hash 可以是任意大小。
# 与 hash 相关的函数有:
# keys:返回 hash 的键列表 my @keylist = keys %hash
# value:返回值列表 my @valuelist = values %hash
# each:用两个元素的列表返回键值对。
while(($key,$value)= each %hash)
{
print$key =>$value\n”;
}

2 Perl流程控制语句

Perl除了支持传统的 if 、while 、for 控制结构,还支持 until 、unless 、foreach 等。

2.1 if 判断语句

Perl 中没有 boolean 类型,零和空表示 False,其余表示 True。

## if
if(expression){
true_statement;
}
## if-else
if(expression){
true_statement;
}
else{
false_statement;
}
## if-elseif-else
if(expression_A){
A_true_statement;
}
elseif(expression_B){
B_true_statement;
}
else{
false_statement;
}

2.2 unless判断语句

unless 和 if 不同之处在于当条件表达式的值为假的时候才执行,同时 unless 后面还能跟 else 语句。如:

unless($mon =~ /^Feb/{	# mon中不以Feb开头则进入条件
print "This month has at least thirty days.\n";
}
else{
print "Do you see what's going on here? \n";
}

2.3 for 循环语句

Perl 中的 for 循环除了支持传统的 for 循环,即 for ( 表达式 1; 表达式 2; 表达式 3) ,还支持 foreach 语句,基本语法为:

foreach $i (@aList){
statement1;
}

2.4 while 循环语句

Perl 循环控制结果还支持 while 和 do-while 以及 until 形式,until 与 while 结构相似,区别在于 unitl 会在条件为假的时候重复执行。until 语法如下:

until(expression){
statement;
}

2.5 循环控制符

Perl 有三个循环控制操作符,分别为 Last 、next 、redo。

  1. last:立即终止循环,类似于 c 中的 break。在多层循环中,只对 last 所在的当前循环块有效;
  2. next:立刻结束当前这次迭代;
  3. redo:将控制返回本循环的顶端,不经过条件测试也不会进去下一次迭代循环,而是重新执行本循环块。它与 next 最大的区别在于 next 会正常继续下一次迭代,而 redo 会重新执行本次迭代。

3 Perl的函数

Perl函数基本语法:

sub functionName{
statement;
[return value]
}

返回值:使用return语句显示返回,如果没有return,默认返回最后一次运算的结果
调用:& 函数名(参数 1,参数 2,…),如果声明在前,可以省略 &。如果用户所定义的子过程与内置函数重名,则不能省略 &。
如下例必须使用 &chomp 调用:

sub chomp{
print “it is my chomp\n”;
}

函数参数

  1. 在子程序调用的后面加上被括号圈引的列表表达式即可,所有的参数都会自动存储为 @_ 中,其中第一个参数为 $[0], 第二个参数存储 $[1]。
  2. 传递引用,在参数前加入 \ 表示为引用

4 Perl的包与模块

Perl 程序把变量和子程序的名称存贮到符号表中,Perl 的符号表中名字的集合就称为 Perl 包 (package)。定义语法为:package mypack;每个符号表有其自己的一组变量、子程序名,各组名字是不相关的,因此可以在不同的 Perl 包中使用相同的变量名,而代表的是不同的变量。Perl 模块有两种来源,一种是随 Perl 发行版本一同打包的,另外就是用 CPAN 中下载的。Perl 模块和包的概念并不清晰,两者有时可以混用。在程序中使用模块的操作称为导入模块;导入模块关键字 use;如:use ModuleName;模块被导入后,其中的子程序和变量就可以直接使用了;要取消一个已经导入了的模块,可以使用关键字 no;如:no ModuleName。

5 Perl的OOP

在 Perl 中,类是 Perl 包,含有提供对象方法的类,而方法是 Perl 的子程序,类名是其第一个参数,对象是对类中数据项的引用。在 Perl 中创建一个新类,首先要创建一个包,扩展名为 .pm, 在创建 perl 包的时候程序的最后一个必须为"1;";否则该包不会被 Perl 处理。

## 创建perl的类和对象
package person;
use strict;
sub new {
	my $class = shift();
	print("CLASS = $class\n");
	my $self = {};
	$self -> {"name"} = shift();
	$self -> {"sex"} = shift();
	bless $self, $class;
	return $self;
}

其中 new() 方法是对象的构造函数,是创建该类的对象实例必须被调用的,它返回该对象的引用。将类名与引用相结合称为”bless”一个对象,其语法为:bless YeReference [,classname]

YeReference 是对被”祝福”的对象的引用,classname 是可选项,指定对象获取方法的包名,其缺省值为当前包名。也可以通过函数 bless 来声明一个构造函数

sub new{
	my $class = shift;
	my $self = {};
	bless $self, $class;
	return $self;
}

创建一个对象可以直接使用 new 关键字。$object = new Person( “mohand”, “sam”, 345);

Perl 类中的方法就 Perl 的子函数,规定第一个参数为对象或者被引用的包,分为静态方法和虚方法。 虚方法通常首先把第一个参数 shift 到变量 self 或 this 中,然后将该值作普通的引用使用。一是通过该对象的引用 ( 虚方法 ),一是直接使用类名 ( 静态方法 )。如上例中如果类 Person 中有 getContactList 则可以直接使用 $object->getContactList() 来调用该方法。

Perl 支持重载,当两个不同的类中含有相同的方法名称的时候,可以用 :: 操作符指定使用哪个类中的方法。
m e s s = Q a v a : : g r i n d ( " w h o l e " , " l o t t a " , " b a g s " ) ; Q a v a : : g r i n d ( mess = Qava::grind("whole","lotta","bags"); Qava::grind( mess=Qava::grind("whole","lotta","bags");Qava::grind(mess, “whole”,“lotta”,“bags”);

由于 Perl 采用了简单的、基于引用的垃圾回收系统。Perl 跟踪对象的链接数目,当某对象的最后一个应用释放到内存池时,该对象就自动销毁。因此一般不需要定义类的析构函数。
Perl 通过数组 @ISA 支持继承。

package Employee;
use Person;
use strict;
our @ISA = qw(person);	# inherits from Person

当子类继承父类的时候,继承了父类的所有方法,但子类也可以覆盖父类的方法。如加入 Employee 想覆盖父类的 getFirstName:

package Employee;
use Person;
use strict;
our @ISA = qw(person);	# inherits from Person

# Override helper function
sub getFirstName {
	my($self) = @_;
	# This is child class function.
	print "This is child class function.\n";
	return $self -> {_firstName};
}

调用直接使用 $firstName = $object->getFirstName(); 如果要调用父类的 getFirstName,则可以使用 $object->Person::getFirstName();

在 Python 中创建一个类的基本语法为 :

class className(bases):
	classBody;

参数 base 可以是一个单继承或者多继承的父类,object 是所有类的父类,位于类继承结构的最上层。类的构造函数为 init(),其中构造函数中 self 会作为第一个默认的参数。而类的析构函数则是 del(),访问类的方法和属性可以直接使用 . 访问符。

6 Perl正则表达式

正则表达式是perl比较突出的一大特色,perl 中正则表达式有三种形式:

  1. 匹配:m// (还可以简写为 /;/ ,略去 m)
  2. 替换:s/// ,为了语法的简化用 /// 表示,略去 s
  3. 转换:tr/// 这种形式包含一系列的字符— / —同时把它们替换为 。

更具体的内容可以见这篇文章,本文不作展开。

  • 1
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值