学习记录
学习perl
脚本有一段时间了,整理下perl
的基础语法,以后忘记了,再回来看。
关于perl执行,注释,打印警告,编程习惯约定
使用命令行执行:
perl -w -e 'print("hello, world\n")'
# -e 执行perl代码
# -w 输出警告(如果有错误)
# 单引号:按照原样输出,双引号:转移输出(\n,被转义成换行),如果没有转义,那双引号和单引号是一样的
使用脚本执行:以下是一些编程习惯
默认以
pl
结尾表示perl脚本
执行perl test.pl
#!/usr/bin/perl -w
# use strict;
# use diagnostics;
print("hello, world\n");
# #号是注释
# print默认带括号,每一行默认带分号(perl比较灵活,没有分号也行)
# 默认使用双引号表示字符串
# 对于初学者,建议加上use strict(初略)或者use diagnostics(详细),打印错误信息(避免拼写错误,限定变量作用域),便于分析debug
使用帮助文档:
perldoc -f print
# 使用perldoc来查询内建函数的使用,包括一些例子
数据类型
perl
中变量分为三种数据类型,以下介绍
标量
标量可以是数字(perl
强制将数字存储为双精度浮点数,所以不需要考虑数字的精度问题),字符串(加双引号),以$
作为标量标识,以下是需要注意的地方
-
举例:
$first = 123; # 数字标量123 $second = "123"; # 字符串标量123
-
关于数字标量非十进制数表示
进制 举例 二进制,以 0b
开头0b1111_1111
,表示十进制255
八进制,以 0
开头0377
,表示十进制的255
十六进制,以 0x
开头0xff(0xFF)
,表示十进制255
-
关于标量申明,在
perl
中,可以在任何地方申明标量并使用(也可以不申明直接用,不建议这么写) -
关于标量的初始值,标量的初始值为空(
null
) -
关于标量运算,数字变量操作(加减乘除),
$a+$b, $a-$b, $a*$b, $a/$b, $a%$b
,字符串标量拼接,$a.$b
-
关于标量的作用域分以下两种:
– 包标量:包标量是包(package
)内的全局标量在整个包以及下面的子函数都可以用
– 私有标量:a.my
型标量,只在本层模块可以看到这个表标量(本层调用的其他函数是看不到
– 的),b.local
型标量,在本层和本层下层的函数都可以看到的。同名标量下,私有类型的标量优先级高#!/usr/bin/perl -w sub g_print{ print("g_test x: ", "$x\n"); } sub test_my{ my $x = 11; # my私有变量,只在本模块使用 print("call my x: ", "$x\n"); g_print(); # 调用外部逻辑,属于本模块的下层模块,看不到本模块my私有变量 } sub test_local{ local $x = 20; # local私有变量,在本模块以及下层模块使用 print("call local x: ", "$x\n"); g_print(); # 调用外部逻辑,属于本模块的下层模块,能看到本模块local私有变量 } $x = 9; #包变量 test_my(); test_local(); print("x: ", "$x\n"); # 结果: # g_test x: 9 # call my x: 11 # g_test x: 9 # call local x: 20 # g_test x: 20 # x: 9
数组
perl
数组一个是存储标量值的列表集合变量,变量可以是不同类型,可以包含任意多个元素,以@
符号作为数组标识,这里的数组指的是一维数组,以下是需要注意的地方
-
举例:
@val = (25, 30, 40); @names = ("google", "runoob", "taobao");
-
数组的下标从左到右以
0
开始,从右到左以-1
开始,@val = ()
表示空数组 -
访问数组元素,下表取值和连续取值,非连续取值,跟很多脚本语言差不多
#!/usr/bin/perl -w @val_0 = (25, 30, 40); # 单元素索引,访问数组中某一个元素,单个数组元素是标量,用的是标量符号 $a = $val_0[0]; print("\$val_0[0]: $val_0[0]\n"); # 25 \表示转义输出, 没法转义的按原样输出 print("\$val_0[-1]: $val_0[-1]\n"); # 40,反向取值 # 连续索引,访问的是数组,用的是数组符号 @val_1 = @val_0[0..1]; print("\@val_0: @val_0\n"); # 25,30 连续取值采用的是数组序列方式 @val_2 = @val_0[0,1]; print("\@val_2: @val_2\n"); # 25,30 非连续取值 @val_3 = @val_0[2, 0..1]; print("\@val_3: @val_3\n"); # 40, 25,30 这样写也行
-
数组序列,用于数组初始化于数组切片,
起始值 + .. + 结束值
@val = (2..6); print("@val\n"); # 表示(2,3,4,5,6) @val = (6..2); print("@val\n"); # 表示空数组 @val = (6, 1..5, 2) print("@val\n"); # 表示(6,1,2,3,4,5,2) @var_abc = ('a'..'z'); print("@var_abc\n"); # 输出 a 到 z
-
数组赋值-纯字符串数组,
# 使用qw标记,各元素以空格或多行来分开,省去了**对字符串加引号**的过程 # 界定符用!,/,(),间隔符使用空格,换行 @array = qw!这是 一个 数组!; @array = qw/这是 一个 数组/; @array = qw(这是 一个 数组); # 使用split(" ", $string)函数,将字符串分割为数组, 双引号中是以此为参照物分割 $string = "Where There Is A Will There Is A Way"; @array = split(" ", $string); print "$array[4]\n"; # 反之使用join(" ", @array)函数,也可以将数组装换成字符串 @array = ("Where", "There", "Is", "A", "Will", "There", "Is", "A", "Way"); $string = join(" ", @array);
-
数组赋值-其他
# a.直接赋值 @array = ("string", 1, 2, 1..5); @array = qw(string1, string2, string3); # b.混合赋值,如果数组包含标量,其他数组,则会进行取值作为元素 # @array2 = ("hello", "world", 123, "how are you?"); $test = "hello"; @array1 = ("world", 123); @array2 = ($test, @array1, "how are you?"); # c.复制赋值, 复制表示的重新存储,区别于索引 @array1 = ("string", 1, 2); @array2 = @array1; # 索引赋值, 单元素索引并修改,连续 @array1 = ("string", 1, 2); $array1[0] = "hello"; @array1[0..1] = ("hello", "world"); # 替换赋值,使用splice(@array, offset, num, list) @nums = (1..20); print "替换前 - @nums\n"; # 从第5个开始,替换5嗝元素,以21..25去替换 splice(@nums, 5, 5, 21..25); print "替换后 - @nums\n";
-
数组添加和删除元素
@sites = ("hello","world","123"); $size = @sites; # 拿到数组大小 # $val = pop(@array)操作,删掉数组中最后一个元素, 并返回这个删除值(当然也可以不要返回) $val = pop(@sites); # #$val = shift(@array)操作,删掉数组开头元素,并返回这个删除值(当然也可以不要返回) $val = shift(@sites); # push(@array, list)操作,在数组末尾添加一个或者多个元素 push(@sites, 1); push(@sites, 1..2); push(@sites, @val); # unshift(@array, list)操作,在数组开头添加一个或者多个元素 unshift(@sites, 1); unshift(@sites, 1..2); unshift(@sites, @val);
-
数组大小或长度
# 数组大小指的是存储物理大小 @sites = ("hello","world","123"); $size = @sites; # #size = 3 $sites[6] = "yes"; $size = @sites; # #size = 7 # 数组长度指的是最后一个数组的索引下标, 使用$#,不能有括号以及数组标志符@ $index_max = $#sites;
哈希
很多脚本语言都有键值对{key:val}
这种数据结构,在perl
语言中叫哈希,以%
符号为前缀,以下举例
-
实例
#!/usr/bin/perl -w # 创建哈希,单双引号都可以 %dict = ("ame", "lisa", "age", 25, "height", "180cm"); print("\$dict{'name'}: $dict{'name'}\n"); print("\$dict{'age'}: $dict{'age'}\n"); print("\$dict{'height'}: $dict{'height'}\n"); # 打印结果,注意打印用双引号打印,内部就只能用单引号,哈希表以{}来表示索引 $dict{'name'}: lisa $dict{'age'}: 25 $dict{'height'}: 180cm
-
创建哈希以及访问元素
# 除了实例中介绍的,一般用=>符号穿件键值对,比较直观 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); # 访问哈希元素格式:$dict{key} $name = $dict{"name"};
-
读取哈希
keys
以及value
# 使用keys函数返回哈希中所有键到列表 # 2022/10/7更新,注意是返回到一个列表中,因此可以用foreach对哈希中键或者值进行单独循环 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); @key = keys(%dict); print("\@key: @key\n"); # 打印结果 @key: height age name # 使用values函数返回哈希中所有的对到列表 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); @value = values(%dict); print("\@value: @value\n"); # 打印结果 @value: 25 lisa 180cm # 对key和value进行循环 foreach my $key (keys(%dict)) { my $value = $dict{$key}; print "$key : $value\n"; }
-
哈希迭代
# 使用each函数对哈希进行迭代,按顺序返回哈希中每一个键值对 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); while(($key, $value) = each(%dict)){ print("key: $key, value: $value\n"); }
-
哈希中添加或删除键值对
# 哈希中是靠键值对来识别元素,添加或删除没有列表那么复杂 # 添加键值对,也可以来修改键值对 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); $dict{"result"} = 100; $dict{"age"} = 18; print("\$dict{'result'}: $dict{'result'}\n"); # 删除键值对,使用delet函数,删掉键值即可 delete($dict{"result"});
-
检查键值对是否存在
# 在读取键值对之前,要判断下该键值对是否存在 # 使用exists函数判断,返回一个布尔值 %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm"); if(exists($dict{"result"})){ print("存在result键"); } else { print("不存在result键"); }
结尾
参考:Perl 教程
参考:perl基础语法
参考书:perl在IC设计实践