perl栏分为perl基本语法、高阶语法、和一个perl自动化脚本生成器案例。
语法部分是笔者学习perl的总结,并非原创。
案例是笔者原创。
perl 基础语法
//string//number//floating number//
8 进制以 0 开始,16 进制以 0x 开始
Perl的三个基本的数据类型:标量、数组、哈希。
标量 $ 开始,如$a $b 是两个标量。
数组 @ 开始,如 @a @b 是两个数组。
哈希 % 开始,%a %b 是两个哈希
数组索引从0开始,要访问数组的变量,可以使用美元符号($)+变量名
访问哈希值,可以使用 $ + {key} 格式
q(hello world) # 等价于'hello world'
qq(hello world) # 等价于"hello world"
qx(echo hello world) # 等价于`echo hello world`
qw简写
使用qw简写列表,各个元素之间用空格隔开,并且对于字符串不需要加引号(加上引号的话将引号作为字符串的一部分)
qw里虽然不用写引号,但它相当于单引号,所以qw里面不能变量替换,不能反斜线序列(如\n):
$perl="perl";
qw($perl python shell\n) # 不会做任何转换,包含三个元素"$perl"、"python"、"shell\n"
使用 use strict 语句让所有变量需要强制声明类型
Perl 语言中常用的一些转义字符如下表所示:
转义字符 含义
\\ 反斜线
\' 单引号
\" 双引号
\a 系统响铃
\b 退格
\f 换页符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\0nn 创建八进制格式的数字
\xnn 创建十六进制格式的数字
\cX 控制字符,x可以是任何字符
\u 强制下一个字符为大写
\l 强制下一个字符为小写
\U 强制将所有字符转换为大写
\L 强制将所有的字符转换为小写
\Q 将到\E为止的非单词(non-word)字符加上反斜线
\E 结束\L、\U、\Q
字符串的连接和重复
字符串连接使用 . ,字符串重复使用小写字母 'x',后面跟重复的倍数,如果倍数是小数则会取整,如果倍数小于1则返回空;
获取子串 – substr()函数
syntax:
substr($string_org, 7, 14, “$substitute”) -- 为:将变量string_org中从字符的第八位(从1开始)开始,取后11位字符,用变量$substitute代替
length()函数
查找字符串的长度,请使用length()函数。此函数计算字符串中的字符数(包括空格)并返回它
syntax:
=length($string_org)
// @var9=(1,2,3,4,5);
索引从 0 开始
//my @arr = qw%
python
perl
shell
%;
使用小括号,元素之间需要逗号,qw需要使用空格
qw定义方式是按原样输出,字符串也不需要加引号,数组元素之间用空格区分
空列表是括号中什么都没有的列表,空列表返回的是undef,但是赋值给别人时,不会当作undef,而是什么都没有,也就是该列表是空的,但是不是没有定义过
对于空列表和列表中的undef元素:
my @empty = ();
if(@empty) {print "valid\n";} else {print "invaild\n";}
1、空列表自身是一个未定义列表,所以它自身返回undef -- 说明:空列表至少使用前声明了,只是内容为空,使用空内容作为表达式时,就会得到undef的结果,undef表示为false,即,条件式if(false)
2、未定义的数组,或者未定义的列表就是空列表(),因为未定义,所以它自身返回undef -- 未定义即未声明,首先未声明就使用,就会报错;
3、将空列表或者未定义的数组作为元素添加到其它列表、数组中时,等于什么都没做,直接被忽略,因为它是没定义过的
4、undef元素是一个实实在在的元素,会占用列表、数组空间 – undef本身表示一个空间,但是这个空间没有初始化,即没有被安置内容(值)进去
添加和删除数组元素
Perl 提供了一些有用的函数来添加和删除数组元素;
下表列出了数组中常用的操作函数:
序号 类型和描述
1 push (@ARRAY, LIST)
将列表的值放到数组的末尾
2 pop (@ARRAY)
弹出数组最后一个值,并返回它;当没有元素可弹出时,返回undef
3 shift (@ARRAY)
弹出数组第一个值,并返回它;数组的索引值也依次减一
4 unshift (@ARRAY, LIST)
将列表放在数组前面,并返回新数组的元素个数
上面的4个函数是对数组的头部和尾部元素进行操作,如果想对数组的中间元素操作,则需要用到splice() 函数;
splice 有4个参数,后两个参数可选:
第一个参数为要操作的数组;
第二个参数为指定从哪个索引位置开始操作;
第三个参数为指定要操作的长度;
第四个参数用来指定替换原数组的数据;
my @sub = (”python”,”perl”,”c++”,”c”);
mu @sub1 = splice(@sub,2,1,qw(shell tcl)); # 该处第二、三个参数是可选的
表示,对列表sub操作,从索引2开始,共1个元素长度的元素被截取出来,作为返回值
print “@sub\n”; # @sub = python perl shell tcl c # 该处的@sub是由被操作的,c++被shell tcl代替,取代了原列表变量sub
print “@sub1\n”; # @sub1 = c++ # 返回值c++
$#数组名 ---表示数组中最后一个元素的下标,它等于元素个数减1。
@数组名 ---表示数组中元素的个数。
$标量=@数组名 ---将一个数组赋值给一个标量变量,标量得到的是这个数组的元素个数。
$数组名[数组下标] ---这种格式可以取出数组中相应的元素。
函数scalar()
函数scalar()获得数组的元素个数
5 $pointer = \@ARGV;
6 printf "\n Pointer Address of ARGV = $pointer\n";
7 $i = scalar(@$pointer); # 打印引用指向的数组的个数
将字符串转换为数组
split ( PATTERN , EXPR , LIMIT )
参数说明:
PATTERN:分隔符,默认为空格。
EXPR:指定的字符串。
LIMIT:如果指定该参数,则指定了字符串拆分成的数组元素个数。
将数组转换为字符串
join (EXPR, LIST)
参数说明:
EXPR:连接符。
LIST:列表或数组。
数组排序
使用 sort() 函数和reverse()函数
sort (SUBROUTINE , LIST)#按照ASCII 顺序来对数组进行排序
参数说明:
SUBROUTINE:指定规则
LIST:列表或数组
reverse(LIST) #对当前的数组顺序进行反转
sort 和 reverse 函数都会返回排序后的数组,并且保持原数组顺序不变
示例:
@domain_num_all = sort { $a <=> $b } @domain_num_all;
// define method
a\ $dft_tile_supra_path{"$a_dft_tile_supra_path[0]"} = "$a_dft_tile_supra_path[1]";
b\ %var12=("hello","哈罗","nihao","你好");
注意:
1)哈希的索引用的是大括号!!! 而数组的索引使用中括号!!
2)哈希的定义可以是上面第6行的形式,即(key1, value1, key2, value2....),也可以使用胖箭头的形式,如上面第7行,即(key1=>value1, key2=>value2......)
3)可以直接输出哈希,但是不能加双引号,如上面的第10和第11行;
4)perl中有一个内建的哈希ENV,可以通过这个哈希来直接访问操作系统中的环境变量,如下:
print ($ENV{PATH});#输出操作系统中的PATH环境变量
读取哈希的值
可以像数组一样从哈希中提取值,通过key来索引,哈希值提取到数组语法格式:@{key1,key2},如下:
my %sub1 = (“math”,100,”chinese”,90,”English”,99);
my @score = @sub1{“math”,”English”};
print (%sub1,”\n”); # %sub1没有花括号
注意,提取某些哈希的值也要使用大括号!!
哈希相关函数
读取所有key,使用keys() 函数,并将所有的key作为一个数组返回(在标量上下文是返回元素的个数),语法格式如下:
keys %HASH
类似的可以使用 values 函数来读取哈希所有的值,并返回一个数组(在标量上下文是返回元素的个数),语法格式如下:
values %HASH
如果在哈希中读取不存在的 key/value 对 ,会返回 undefined 值,且在执行时会有警告提醒;
为了避免这种情况,可以使用 exists 函数来判断key是否存在,存在的时候读取
删除哈希元素需要使用 delete 函数
delete($hash_name{键})
hash的切片
指将想要的元素提取到一个新的数组:@hash_name{"键1",“键2”...} #一定要用{}
hash的合并
将两个或者多个hash合并成一个hash:%new_hash=(%hash_1,%hash_2) #一定要用()。若键一样,后面的覆盖前面
遍历哈希
遍历哈希可以使用each和foreach;
each 每次可以获取一个键值对,并做位置标记,以便下次从这个位置开始遍历;
foreach 只能通过keys() 函数来遍历key,从而间接遍历哈希
示例:
my $stac_list=""; # scalar variable
my @domain_num_all; # define one array variable
my $dft_clk_cntl_arch = {}; # define void hash,匿名hash
my %dft_tile_supra_path; # define hash
my @dft_clk_cntl_arch2array=(); # define array
4 handle 文件句柄
open(FILEHANDLE,"<test.htm");
$templine=<FILEHANDLE>;
close(FILEHANDLE);
5 pointer 指针(地址)
$vavr13="hello";
$pointerto=\$var13;
这时$pointerto就是一个指向$var13的指针了。访问指针指向的数据可以使用下面的方法。print$$pointerto;
my $content << EOF;
…
EOD
使用概述
1.必须后接分号,否则编译通不过。
2.END可以用任意其它字符代替,只需保证结束标识与开始标识一致。
3.结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
4.开始标识可以不带引号号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
5.当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
undef 和 defined() 函数
undef 表示变量未定义,它不等于字符串的空,也不等于数值0;
但是一般情况下,将undef 当作空或0就好了,因为在需要数值的时候,undef代表的就是0,需要字符串的时候,undef就是空字符串;
所以,perl中的完全可以直接使用未定义的变量,因为未定义的变量起始就是undef。它可以被当作0,也可被当作空字符串;
例如,下面两个语句中,$sum和$str都是未定义的,初始时它们分别表示数值0和空字串''
示例:
perl -e 'print $sum $str\n' # 这样的语句并不会出错,默认undef的变量为空
可以直接将undef关键字赋值给某个变量,表示这个变量是undef的,这可以取消一个变量的定义,相当于bash shell中的unset
示例:
perl -e '$weifexie = weifexie ;$wefexie = undef; print "$weifexie\n"'
结果为:
空(什么都没有)
最常用的方法是使用 POD(Plain Old Documentations) 来进行多行注释。方法如下:
=pod
codes to comment
=cut
注意:=pod =cut只能在行首
以=开头,以=cut结尾。
注意:=后面要紧接一个字符。=cut后面可以不用。
以下我们将演示 Perl 中特殊字符的应用,如 __FILE__, __LINE__, 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名。
注意: __ 是两条下划线,__FILE__ 前后各两条下划线
print __FILE__ ."\n";
print __LINE__ ."\n";
print __PACKAGE__ ."\n";
条件语句的判断条件结果为false、true两类
NOTE:数字 0, 字符串 '0' 、 "", 空 list (), 和 undef 为 false ,其他值均为 true; true 前面使用 ! 或 not则返回 false
Exp1 ? Exp2 : Exp3;
Exp1 表达式为 true ,则返回 Exp2 表达式计算结果,否则返回 Exp3;
if语句
- if(){}
- if(){}else {}
- if(){}elsif(){}else{}
unless(){}
(和if相反,if是条件成立执行,unless是条件不成立执行语句)
和if相同有1、2、3
switch语句
语法格式:
use Switch;
switch(argument){
case 1 { print "数字 1" }
case "a" { print "字符串 a" }
case [1..10,42] { print "数字在列表中" }
case (\@array) { print "数字在数组中" }
case /\w+/ { print "正则匹配模式" }
case qr/\w+/ { print "正则匹配模式" }
case (\%hash) { print "哈希" }
case (\&sub) { print "子进程" }
else { print "不匹配之前的条件" }
}
语法格式:
given (argument) {
when (condition) { statement(s); }
when (condition) { statement(s); }
when (condition) { statement(s); }
.
.
.
default { statement(s); }
}
循环类型 描述
while 循环
当给定条件为 true 时,重复执行语句或语句组。循环主体执行之前会先测试条件。
语法格式:
while(){}
until 循环
重复执行语句或语句组,直到给定的条件为 true。 循环主体执行之前会先测试条件。(当条件不成立时执行)
语法格式:
until(){}
for 循环
多次执行一个语句序列,简化管理循环变量的代码。
for(initial;condition;increment){}
foreach 循环
foreach 循环用于迭代一个列表或集合变量的值。
syntax:
foreach my $item (@items)
{ … }
foreach (@temes)
{ … }
foreach (1..5)
{ … }
特殊形式
s/^STAC// foreach @array_stac_list;
each
each 操作符可以获取一个键值对(key/value),可以用来操作数组也可以是哈希,each 对数组操作时返回的是数组元素的索引和元素值
syntax:
my ($index, $value) = each @array;
do...while 循环
除了它是在循环主体结尾测试条件外,其他与 while 语句类似。(先执行循环体,再去条件判断)
语法格式:
do{}while();
改变了代码的执行顺序,通过它你可以实现代码的跳转
控制语句 描述
next 语句
类似于其他语言的 continue,表示结束本次循环,转而进入下一次循环
last 语句
退出当前层次循环语句块,从而结束当前层次循环,但是不会跳出外层循环,类似于 break
continue 语句
continue 语句块通常在条件语句再次判断前执行。
continue 语句可用在 while 和 foreach 循环中
语法格式:
while(condition){
statement(s);
}continue{
statement(s);
}
foreach $a (@listA){
statement(s);
}continue{
statement(s);
}
(有些感觉类似于continue{increment},即将increment从第一个statement中拿出来到continue中作为一个单独的语句)
示例:
#/usr/bin/perl
$a = 0;
while($a < 3){
print "a = $a\n";
}continue{
$a = $a + 1;
}
执行结果,
a = 0
a = 1
a = 2
示例:
#/usr/bin/perl
@list = (1, 2, 3, 4, 5);
foreach $a (@list){
print "a = $a\n";
}continue{
last if $a == 4;
}
执行结果,
a = 1
a = 2
a = 3
a = 4
(last和next用法同break和continue,指的是shell中的break和continue的用法)
redo 语句
redo 语句直接转到循环体的第一行开始重复执行本次循环,所以本次迭代中曾执行过的语句可能会再次执行,redo语句之后的语句不再执行,continue语句块也不再执行;
goto 语句
Perl 有三种 goto 形式:got LABLE,goto EXPR,和 goto &NAME。
示例:
#!/usr/bin/perl
$a = 10;
LOOP:do {
if( $a == 15) {
# skip the iteration.
$a = $a + 1;
# use goto LABEL form
goto LOOP;
}
print "Value of a = $a\n";
$a = $a + 1;
} while( $a < 20 );
$[
特殊变量 $[ 表示数组的第一索引值,一般都为 0 ,如果我们将 $[ 设置为 1,则数组的第一个索引值即为 1,第二个为 2,以此类推。
不建议使用特殊变量 $[,在新版 Perl 中,该变量已废弃;
$!
根据上下文内容返回错误号或者错误串
$”
列表分隔符
$#
打印数字时默认的数字输出格式
$$
Perl解释器的进程ID
$%
当前输出通道的当前页号
$&
与上个格式匹配的字符串
$( 当前进程的组ID$)
当前进程的有效组ID
$*
设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
$,
当前输出字段分隔符
$.
上次阅读的文件的当前输入行号
$/
当前输入记录分隔符,默认情况是新行
$:
字符设置,此后的字符串将被分开,以填充连续的字段.
$;
在仿真多维数组时使用的分隔符.
$?
返回上一个外部命令的状态
$@
Perl解释器从eval语句返回的错误消息
$\
当前输出记录的分隔符
$]
Perl解释器的子版本号
$^
当前通道最上面的页面输出格式名字
引用是指向数据项,反引用是访问它所指向的实际数据项。引用和内存中的数据项地址非常的类似,通过使用地址可以直接访问数据项。perl中有两种类型的引用:直接引用 和符号引用
按照名称来引用数据项,而让perl来处理具 体的数据项细节,但如果我们知道,或者能够得到数据项 的内存位置,那我么也可以通过位置来访问数据项.
1: $first = 5;
2: $ref = \$first; # $ref是$first的引用,反斜线\加上$first构成‘\$first’,即为得到变量$first的引用(得到$first内容的地址)
3: print "$ref\n"; # 打印引用(地址)
4: print "$$ref\n"; # 打印引用内容(地址内容)
这里我们用了前缀运算符($,@,%)来反引用,反引用提供了原始的数据值。
符号引用(软引用)
符号引用并不保存数据项的地址和类型,而是保存数据项的名称 (记住,可以用两种方法引用数据,按名称或者按地址)
1: $first = 5;
2: $ref = "first";
3: print "$$ref\n";
4: #上面输出'5'
5: @a=(1,2,3);
6: $ref_a="a";
7: print "@$ref_a\n";
8: #上面输出1 2 3
(个人对此有疑惑,$a和@a用符号引用会不会出错呢?执行上述脚本出现了问题)
结果得到了如下error message
<Can't use string ("first") as a SCALAR ref while "strict refs" in use>
笔者就没有使用过软引用了。欲删除本内容,留习之。
箭头运算符号,是非常重要的运算符号(称为中缀反引用运算符) 也是一个流行的反引用运算符
1: @array = (1,2,3);
2: $ref = \@array;
3: print " @$ref[0]\n";
4: print " $ref->[0]";
5: #结果是一样的都是1
匿名数组、hash表和子程序
perl的强大功能之一就是可以使用数组、哈希表和子程序 的引用,而不是名称来创建那些结构。也就是说需要存储 的是对他们的引用,而不是名称。
1: $arrayref=[1,2,3];
2: print $$arrayref[0];
3: #1
4: #变量$arrayref存储了对数组的引用,而不是对新数组的名称
5: #可以按照名称或者按照位置来引用数据项,上面就是对这种想法
6: #的合理延伸,另外,可以创建仅有引用来标示的数据项。
可以用反斜杠\运算符来创建之间引用,可以在标量、数组 hash、子程序或者简单值上使用反斜杠运算符。
1: $ref = \ "Hello";
2: print $$ref;
3: #Hello
4: #这种方法的嵌套深度任意
5: $ref=\\\\ "Hello";
6: print $$$$$ref;
7: #Hello
假设某个引用存在,在进行了反引用操作,则那个引用自动生成,
1: $$ref=5;
2: print "$$ref\n";
3: print "$ref\n";
引用的最大用途之一就是向子程序传递数组和hash表。如果直接传递数组或者 hash,则他们将一起展开到@中。下面这个程序将对两个数组的引用传递给子程序,这个例子将对两个数组的引用 传递给子程序,这个子程序将数组中对应的元素相加,并返回产生的数组,向子 程序传递引用而不是传递数组本身,就避免将数组展开到无法区分的长列表中:
1: @a = (1,2,3);
2: @b = (4,5,6);
3:
4: sub addem
5: {
6: my ($reference1,$reference2)=@_;
7: for ($loop_index = 0; $loop_index <= $#$reference1;$loop_index++)
8: {
9: $result[$loop_index] = @$reference1[$loop_index] + @$reference2[$loop_index];
11: }
12: return @result;
13: }
14: @array = addem(\@a,\@b);
15: print join (', ', @array);
使用方括号,可创建无名称数组,也就是匿名数组
1: $array_ref = [1,3,4];
2: print $$array_ref[0]; # 等同于array_ref[bg0]
3: #1
4: #也可以使用箭头运算符来反引用数组运算符号
5: $array_ref = [1,3,4];
6: print $array_ref->[0];
匿名数组在很多方面都有作用,例如,可以使用匿名数组构成符来建立数组的副本, 以进行破坏性测试,而不会损害原来的数组。
1: @a = (1,2,3);
2: $s = pop @a;
3: print "@a\n";
4: #1 2
5: #但是,如果用匿名数组构成符建立数组副本,则副本会发生变化,而原始数据保持不变
6: @a = (1,2,3);
7: $s = pop @{[@a]} # a{} 的使用方法
8: print "@a\n";
9: # 1 2 3
————————————————
案例:
1、perl -e 'print ( "@{[uc ( hello ) ]} there.\n" ) ;' # HELLO there.
2、perl -e 'print ( "@{[(1,2,3)]} there.\n" ) ;' # 1 2 3 there.
1: #对标量的引用
2: $first = 100;
3: $ref_first = \$first;
4: print "$$ref_first\n";
5: #100
6:
7: #对数组的引用
8: @second = (1,2,3);
9: $ref_second = \@second;
10: print "@$ref_second\n";
11: #1 2 3
12:
13: #对hash的引用
14: %hash = (apple => fruit);
15: $ref_hash = \%hash;
16: print "$$ref_hash{apple}\n";
17: #friut
18:
19: #第子程序的引用
20: sub subroutine
21: {
22: print "Hello!\“;
23: }
24: $sub_ref = \&subroutine;
25: &$sub_ref;
Perl ->符号用法的两种解释
Perl ->符号第一种用法,就是解引用
根据->后面跟的符号的不同,解不同类型的引用,->[]表示解数组引用,->{}表示解散列引用,->()表示解子程序引用。
例子:
$arr_ref=\@array;
$arr_ref->[0]访问数组@array的第一个元素。
$hash_ref=\%hash;
$hash_ref->{foo}访问%hash的foo分量
$sub_ref=\&test;
$sub_ref->(1,2,3)使用参数列表(1,2,3)来调用&test这个子程序。
Perl ->符号第二种用法,就是调用类或者对象的方法
格式:
$obj->method();
或者
ClassName->method();
例如:
$pop3->login($username,$password);
my$ftp=Net::FTP->new("some.host.name",Debug=>0);
perl的变量与括号
perl中的括号很有意思,各种括号开始的时候真有些让人有点迷糊。但是渐渐地会发现,这里面都是有规律可循
perl基础的变量有标量(SCALAR)、数组(ARRAY)、哈希(HASH)。
标量的标识符是以$(scalar)开头,可以表示数字或字符串,如:$a=1;$b='abc';
数组的标识符是以@(array)开头,用来表示一系列类型相同的变量。如:@a=(1,2,3);@b=(’a','b','c');注意!后面使用的是圆括号。取值使用下标(从0开始),如$a[0]。这里取值时前面是$,可以这样理解:因为取得的值是一个标量。而下标处用的是方括号。
哈希的标识符是以%开头,用来表示一系列键值对。可以用数组的方式定义,也可以使用=>方式,如下:%a=('a',1,'b',2);%b=('a'=>1,'b'=>2);注意,这里也是圆括号。访问值和数组差不多,$a{'a'}。这里key使用的是花括号。
其实,数组、哈希的括号也有一定的规律,挺有意思的。直接定义时都使用(),而访问则分别用[]和{}。另外后面讲到的匿名存储中的匿名数组和匿名哈希也是分别用[]和{}来定义的。(有时候可以看到定义,$ref_a = [],$ref_h = {};这是分别定义了一个空的匿名列表和哈希。)
对于熟悉c/c++的来说,引用应该比较熟悉。在很多场合下使用引用传值,能在很大程度上提高代码的运行效率。
那么如何定义一个引用呢?
其实很简单,在变量名前加一个”\”就可以了,如:$ra=\$a;$rb=\@b;$rc=\%c;变量名前面依然是$。
而得到的引用是不能直接当做变量使用,需要解引用。解引用的方法是在变量名前加上变量原本类型所对应的符号。比如$rb是对一个数组的引用,那为了得到数组,就可以使用@$rb来得到整个数组。可以通过两种方式访问数组中数据,一种是
rb[1],另一种是使用“−>”符号$rb−>[1]。明显第二种方式更加简洁。对哈希的操作类似rc{a},$rc->{a}。
匿名数据结构也是经常用到的,比如在useragent的post方法中会传递一个匿名的hash表。
匿名数组的创建不再是使用(),而是[];同样匿名hash使用{}创建,而不是()。注意,它返回的是引用!$ra={'a'=>1,'b'=>2};$ra->{a}=3;print$$ra{a};
示例:
use data::Dumper;
my $dft_clk_cntl_arch = {};
print "\%\${dft_clk_cntl_arch}:",Dumper (\%{$dft_clk_cntl_arch});
————————————————
File::Spec 模块
rel2abs
返回一个文件的绝对路径, 常见用法,返回当前运行的perl脚本的绝对路径
代码示例:
my $prog = File::Spec->rel2abs( __FILE__ );
其中 __FILE__ 是一个内置变量,代表当前脚本;
splitpath
将文件的路径进行分割,返回值为一个长度为3的列表,第一个元素为该文件,第二个元素为该文件所处的目录,第三个元素为该文件的名字
代码示例:
my $prog = $prog = File::Spec->rel2abs( __FILE__ );
my (undef, $dir, undef) = File::Spec->splitpath($prog);
这里有一个不常见的写法,当解列表的时候,可以用undef 接受那些你并不关心的变量;
catpath
用/ 分隔符将文件连接起来
代码示例:
my $align_prog_s = File::Spec->catpath($vol,$script_path,$align_bin_s);
use File::Path;
mkpath、rmtree命令的使用
mkpath( $dir ) # mkpath在有些版本的perl中是使用make_path
mkpath( $dir, $verbose, $mode )
mkpath( [$dir1, $dir2,...], $verbose, $mode )
mkpath( $dir1, $dir2,..., \%opt )
rmtree( $dir ) # 或remove_tree函数
rmtree( $dir, $verbose, $safe )
rmtree( [$dir1, $dir2,...], $verbose, $safe )
rmtree( $dir1, $dir2,..., \%opt )
注释:
$dir: dirname:将要创建的目录名,可以为字符串或表达式、
$mode: permisions:八进制数,指定目录的访问权限、
执行特定的数学或逻辑操作的符号
算术运算符
有 +,-,*,/,%,**,对象是数字
比较运算符
有 ==,!=,<=>(检查两个操作数的值是否相等, 如果左边的数小于右边的数返回 -1,如果相等返回 0, 如果左边的数大于右边的数返回 1),>,<,>=,<=,对象是数字,返回值为false、true
逻辑运算符
有eq,ne,cmp(同上),gt,lt,ge,le,对象是字符、串,返回值为false、true
赋值运算符
有=,+=,-=,*=,/=,%=,**=,对象是数组
位运算符
有&,|,^(如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。即相同为0,不同为1),~,<<,>>,对象是数字
示例:设置 $a = 60,$b = 13,现在以二进制格式表示,它们如下所示:
$a = 0011 1100
$b = 0000 1101
-----------------
$a&$b = 0000 1100
$a|$b = 0011 1101
$a^$b = 0011 0001
~$a = 1100 0011
逻辑运算符
有and,&&,or,||,not,!,对象是两个部分,返回值为false、true
引号运算符
有q{},qq{},qx{},qw{}
运算符 描述 实例
q{ } 为字符串添加单引号 q{abcd} 结果为 'abcd'
qq{ } 为字符串添加双引号 qq{abcd} 结果为 "abcd"
qx{ } 为字符串添加反引号 qx{abcd} 结果为 `abcd`
qw{ } 为列表的定义形式 qw{ab cd} 为列表(ab,cd)
其他运算符
有 .,x,..,++,--,->,对象各不相同
运算符 描述 实例
. 点号 (.) 用于连接两个字符串。 如果 $a="run", $b="oob" , $a.$b 结果为 "runoob"
x x 运算符返回字符串重复的次数。 ('-' x 3) 输出为 ---。
.. .. 为范围运算符。 (2..5) 输出结果为 (2, 3, 4, 5)
++ 自增运算符,整数值增加 1 $a =10, $a++ will 输出为 11
-- 自减运算符,整数值减少 1 $a =10, $a-- 输出为 9
-> 箭号用于指定一个类的方法 $obj->$a 表示对象 $obj 的 $a 方法。
————————————————
运算符优先级
运算符符 结合性
++, -- 无
-, ~, ! 从右到左
** 从右到左
=~, !~ 从左到右
*, /, %, x 从左到右
+, -, . 从左到右
<<, >> 从左到右
-e, -r, 无
<, <=, >, >=, lt, le, gt, ge 从左到右
==, !=, <=>, eq, ne, cmp 从左到右
& 从左到右
|, ^ 从左到右
&& 从左到右
|| 从左到右
.. 从左到右
? and : 从右到左
=, +=, -=, *=, 从右到左
其他
, 从左到右
not 从左到右
and 从左到右
or, xor 从左到右
word文档分为基础语法部分。
高阶语法部分、案例随后会用另一个word文档附上。
==念念不忘,会有回响。==
END