PERL学习笔记

1 篇文章 1 订阅

PERL学习笔记

目的与作用

大部分公司都会使用脚本辅助进行verilog代码生成、UVM仿真平台搭建、寄存器模型生成等,学会perl脚本、shell脚本与python脚本不仅能够丰富自己的简历,在懂技术的基础上懂一些脚本简直就是如虎添翼。而且在自己编写代码时也能提升效率,如本人之前就利用perl脚本编写了一个自动生成filelist的脚本,具体看链接:
自动生成filelist
由于本人学习PERL脚本主要用于辅助进行代码设计,因此只学到正则,对perl感兴趣的可以移步至菜鸟网学习。
菜鸟教程(PERL)

编程方式:

交互式编程:perl -e ‘指令’

脚本式编程:头部添加 #!/usr/bin/perl 使用时perl 文件名.pl

数据类型:

标量:$+标量名;

数组:@+数组名=(数组初始值);

哈希:%+哈希数组名 = (‘键名’=>‘键值’,…);

使用时,可以通过$data{‘键名’}获取对应键值;

浮点数:定义与标量一致,可以使用e+小数点位数方式定义;

字符数组:使用与标量一致;

在print单引号时,引号内部的变量名不会对应相应值,只有双引号时才会调用响应变量值

参考:

$a = 123;
print(‘此处不会打印a的值, $a);
print("此处会打印a的值,$a");

转义:

| \0 | 转化为8进制 |
| \x | 转化为16进制 |
| \u | 后面单个字符转化为大写 |
| \l | 后面单个字符转化为小写 |
| \U | 后面所有字符转化为大写 |
| \L | 后面所有字符转化为小写 |

字符串连接

字符串连接使用“.”进行连接;

$a = "hello world";
$b = "llll";
$c = $a.$b;
print("$c\n");

字符串同样可以和常量标量进行拼接,拼接方法相同。

数组:

数组索引:

对数组的索引使用[]的形式进行索引,与C相同,不同点在于:

1、可以使用负数作为索引下标

@a = (1,2,3,4,5);
$b = $a[0];
$c = $a[-1];

在上例中,b代表1即数组a的第一个元素,c代表5,即数组a的最后一个元素。

数组操作

2、可以按照序列的形式输出数组

@a = (1..10);
print("@a\n");

3、数组大小可通过scalar + @数组名的方式获取

print "a数组的大小为:",scalar @a,"\n";

4、数组添加与删除元素、数组

push @a,b 将元素b添加到数组a的尾部

pop @a 删除数组a的最后一个元素

shift @a 弹出数组的第一个元素,返回该元素同时索引值减一

unshift @a,b 可以将数组b的元素添加到数组a前,并返回数组个数。

通过pop 和 shift弹出的元素都将返回,可以获取;

5、数组切割

通过[]指定元素的方式,可以对数组内指定元素进行选取、切割

@a = (1..5);
@b = @a[1..2];
print("@b");

6、数组替换

通过splice可以实现对数组元素的替换

@a = (1,2,3,4,5);
splice(@a,1,2,(3,4));

上述例子将a中的2、3位置上的元素替换为3、4

7、数组分割

使用split对数组进行分割,split(‘定位元素’,$+数组名);

$var_string = "www-runoob-com";
@string = split('-', $var_string);
@string 将变为 www runoob com
@string[2] = "com"

8、数组拼接

将数组进行拼接,并转化为字符串;

$var_string = "www-runoob-com";
@string = split('-',$var_string);
$string1 = join('-',@string);
print("$string1\n");

上述输出将变为www-runoob-com;

9、数组排序

对数组进行排序;

@sites = (google taobao runoob facebook);
@sites = sort(@sites);
print("@sites");

输出为;facebook google runoob taobao

按照ASCII的编码方式进行排序;

10、数组合并

@numbers = (1,2,3,4,5);
@numbers1 = (6,7);
@numbers2 = (@numbers,@numbers1);

括号内将直接进行拼接;

哈希

1、定义

哈希的定义可以通过以下方式进行;

%data = ('name','tailei','age','26');
or 
%data = ('name'=>'tailei','age'=>'26');

2、索引

获取值的方式:

@array = @data('name','age');
or
@array = $data{'name'};

读取所有key或value

keys %data
values %data

3、检索键值是否存在

exists($data{'facebook'});//将返回0

4、获取hash的大小

key1 = keys %data;
$size = key1;

5、增删元素

$data{'facebook'}='facebook.com';

上述方式可将facebook=>facebook.com添加进%data

6、遍历hash

%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
foreach $key (keys %data){
    print "$data{$key}\n";
}
or
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
while(($key, $value) = each(%data)){
    print "$data{$key}\n";
}

条件转移

1、if…else

if(a > 1){
    表达式
}
else{
    表达式
}
if(a > 1){
    表达式
}
elsif(a < 1){

}else
{

}

与C大致相同,不同点在于即使表达式为单行指令,同样需要加花括号。

2、 三目运算

使用方法与C一致,

3、switch

switch语句与C一致,不同点在于case 后省略冒号,而改用花括号,且没有default 使用else 取代

switch($a){
    case 1 {printf("");}
    case 2 {printf();}
    else {}
}

循环

1、while

while循环与C一致

2、until

与C一致

3、for

与C一致

4、foreach

@a = (1..5);
foreach $b(@a){

    print("$b");
}

$后面的字符与数组本身无关,在使用的时候保持一致即可

5、do…while

do…while 与 while 基本一致, 不同点在于do…while能够保证至少执行一次

6、next语句

当循环中出现next,且包含next的循环判断语句生效时,将跳过当次循环,与continue类似

7、last

last则直接跳出循环

变量作用域

使用my、our、local等声明变量的作用域

my @a = (1..5) #局部变量
our @a = (1..5) #全局变量
local @a = (1..5) #局部变量的扩展,包括本层及本层下一层,及子函数的函数调用同样可以使用
@a qw(1..5) #作用与our相同,不推荐 基本没用,能看懂就行

静态变量

使用静态变量时必须加上use feature 'state';
!/usr/bin/perl -w
use feature 'state';
sub auto_add{
    state $a = 0;
    printf("a 的值为 $a","\n");
    $a++;
}
auto_add();
auto_add();
auto_add();
auto_add();

上述示例的输出为:

a的值为 0
a的值为 1
a的值为 2
a的值为 3

引用

引用时:

@b = (1..5);
$a = /@b;

调用时:

printf("@$a");

函数引用

sub print_hello{
    print("Hello world");
}
$a = /&print_hello;

调用时:

&$

获取时间

1、time()

time函数将返回自1970年1月1日至今的秒数

2、localtime()

localtime将返回 秒 分 时 日 月 年 周几 一年当中的第几天 夏令时

@months = qw( 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 );
@days = qw(星期天 星期一 星期二 星期三 星期四 星期五 星期六);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";

函数调用

sub sub_function{
    my @list = {@_};
    表达式
}

上述函数中出现的@_即表示输入参数,为数组形式

如果同时输入多个参数,将自动被合并为一个数组

格式化输出

perl中格式化输出需要先指定format
制作format
format EMPLOYEE = 
===========================
@<<<<<<<<<< #这里可以用@或者^打头,其中@为单行 ^为多行
$name,$age
@####.##
$salary
===========================
.
制作完毕
使用;
$~ = EMPLOYEE; #$~用于指定表格样式;
@n = ("Ali", "Runoob", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
    $name = $_;
    $age = $a[$i];
    $salary = $s[$i++];
    write;
}
$_用于指定默认输入参数,@_为默认输入参数数组。
write在不指定输出位置时默认输出STDOUT,可以通过select(STDOUT);指定输出位置
可以使用 ~^指定表头
表头的制作参考下文:

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

于表格制作的方法一致

格式化输出到文件中

可以通过open函数打开文件
open(my_file,">>my_file.txt");
write(my_file);再通过上述语句指定输出文件
但是这样同时会改变$~,这将导致报错,没有my_file的format格式
此时可以在下面再创建一个format my_file
或者使用select(my_file);的方式修改输出路径
修改后再通过$~ = EMPLOYEE;的方式将format格式指定回来。

文件操作

对文件的操作可以通过open的方式打开文件

获取输出流可以通过

$name = <STDIN>; 键盘输入将赋予$name变量

也可以通过

@a = <my_file>;将文件my_file 中的数据存入@a数组内部

或者通过

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH 的方式从文件句柄中读取数据并存入SCALAR中

文件拷贝

#!/usr/bin/perl

# 只读方式打开文件
open(DATA1, "<file1.txt");

# 打开新文件并写入
open(DATA2, ">file2.txt");

# 拷贝数据
while(<DATA1>)
{
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

文件重命名

#!/usr/bin/perl

rename ("/usr/runoob/test/file1.txt", "/usr/runoob/test/file2.txt" );

删除文件

#!/usr/bin/perl

unlink ("/usr/runoob/test/file1.txt");

目录操作

$dir = "./" #指定目录
my @files = glob ($dir);#查找该目录下的文件以数组形式返回给@files;
foreach(@files){
    print $_."\n" #遍历打印目录
}or

opendir(DIR,"./") or die "无法打开目录";#打开指定目录并将句柄返回给DIR
foreach($file = readdir DIR);#读取DIR下所有文件 并返回给$file 参数

新建目录

$dir = "./perl";
mkdir($dir) or die;
rmdir($dir) or die;#删除目录 
chdir("./project");#切换dir

递归遍历目录

File::Find::find(\&callback, @recursiveFolder);
File::Find::find 主要用于寻找整个目录下的所有文件
第一个参数为函数指针,主要用于打印目录信息。第二个参数为目录位置。
变量 $File::Find::name 为被访问的文件全路径名,
$File::Find::dir 为被访问的文件目录的绝对路径。

查找绝对路径:

use Cwd;
my $dir = getcwd;
say $dir;

my $dir_ = $ENV{'PWD'};
say $dir_;

use File::Spec;
my $path_curf = File::Spec->rel2abs(__FILE__);
my ($vol, $dirs, $file) = File::Spec->splitpath($path_curf);
print "PATH = ", $path_curf,"\n";
print "Dir  = ", $dirs,"\n";

错误处理:

可以在执行某个可能报错的程序后加or die 或者 or warn 等函数,做类似异常处理。

open(my_file,"./tmp") or die"文件不存在" 
open(my_file,"./tmp")|| die "文件不存在"
用warn的话就只会警告不会退出。

carp函数和warn一样。

cluck函数将追踪溯源。

crock与die一样

confess与die一样,会追踪溯源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值