Perl总结.docx
《Perl总结.docx》由会员分享,可在线阅读,更多相关《Perl总结.docx(15页珍藏版)》请在冰豆网上搜索。
![Perl总结.docx](https://file1.bdocx.com/fileroot1/2023-1/3/38666d30-1ba2-4987-9080-58c0ddb127bc/38666d30-1ba2-4987-9080-58c0ddb127bc1.gif)
Perl总结
merge_range和write_unicode函数在直接使用列号或者行号表示区域时都以0开始,(0,0)表示A1,(0,1)表示B1
但是用字母表示时却不一样。
例如:
A1,B5,一个就表示了具体的行号和列号
$totalworksheet->write_unicode(0,0,$maps->to_unicode("名称"),$format);
$totalworksheet->write_unicode(0,1,$maps->to_unicode("总量"),$format);
第二章标量与数据
1.#!
/usr/bin/perl是系统中Perl所在的路径
2.Perl程序并不需要变量声明的部分,所有变量可以直接使用。
但是如果想提前声明也可以。
3.换行符\n
最好在每一行输出的信息的末尾加上换行符,使得程序执行完后SHELL的提示符出现在
新的一行的开始,而不是在输出内容的后面。
4.反引号``运行一个外部命令,使用一对反引号来调用。
反引号和单引号不同,注意别搞混了。
5.perldoc-u-fatan2>d:
/temp
可以将命令执行结果和输出内容导入别的文件。
6.标量SCALAR用于称呼单件事物,是Perl中最简单的数据类型。
类似于别的语言的常量和变量
7.双精度浮点数
所有的数字都以这种形式存储和参加运算,不区分小数,整数或者浮点数等。
但是在程序代码中书写时还是可以用各自的直接量来表示的。
例如:
浮点数直接量,整数直接量等
8.运算符
+-*/
%求余(取模)
**乘冥
9.字符串
由可输入的字母,字符和数字任意组合而成。
最短为空字符,长度无限制。
字符串直接量有两种不同的形式:
单引号和双引号内的字符串
1)。
单引号字符串中要表示多行数据时可以直接加入回车换行,按下“Enter”键。
反斜线\n不再表示换行,而是显示\n
除了单引号和反斜线以外,单引号内的所有字符都代表它们自己,包括换行符本身。
2)。
双引号内的字符串直接量,反斜线拥有更强大的,更完整的能力,可用来表示控制字符,也可以用八进制或者十六进制表示任何字符,实现双引号内的反斜线转义。
双引号内的字符串可以实现变量内插,单引号内的不能实现内插,但是可以外串。
例如:
$temp=“teststringappend”;
print“Theprogramisto$temp\n”;
print‘Theprogramisto$temp’.”\n”;
print‘Theprogramisto‘.$temp.”\n”;
PAGE33
10.字符串连接用“.”句点符号连接多个字符串,实现拼接
字符串重复字符串X次数实现将左边的字符串重复多次显示。
左操作数是重复的字符串,右操作数是重复的次数。
先取整,如果小于1,则产生长度为0的空字符串。
11.接收从键盘输入的资料,必须以回车结束,所有最后一个字符为回车符。
、
12.chomp操作符去掉字符串末尾的回车符,只能去掉一个,就是最后的一个换行符。
处理字符串变量时,它是去掉行末换行符的最佳方式。
13.undef值在赋值之前被使用时,该变量的值就是undef值,它不是空字符串或者0,但是根据变量的赋值可以将undef值当作空字符串或者0来处理。
可以通过defined函数来判断是否为undef值。
可以通过undef关键字来自己构造初始值为undef值的变量。
14.defined函数如果是undef,则返回假,否则返回真。
第三章列表与数组
标量代表的是单数,列表和数组代表的是复数。
列表是标量的有序集合,而数组是存储列表的变量。
列表和数组中的每个元素都是单独的标量变量,拥有单独的标量值,而且这些值是互不相关的,是有序的。
各个标量变量的类型可以不一样,可以是数字,字符串,undef等的混合。
每个元素是有序的,先后次序是固定。
可以通过下标来访问。
下标从0开始,没有上下限。
如果超出,则得到undef值。
1.访问数组的元素
2.特殊的数组索引值索引值可以超出数组的索引范围,超出时可以自动扩大数组,扩大产生的标量默认值为undef。
3.列表直接量一对圆括号中用逗号隔开的一系列值。
可以使用范围标识符.
例如:
(1..100)(5..1)为空列表,仅向上计数,
4.qw简写可以建立简单的单词、字符串列表。
每个列表标量相当于是单引号内的字符串,忽略所有的回车符,空白,控制符等。
用空白隔开的各个字符串,省掉单引号。
定界符可以是圆括号和其他Perl允许的任何一对标点符号。
如果是括号类的,左右可以不一样,但是如果是别的,则必须左右一样。
5.pop/push操作符pop的操作数和push的第一个操作数必须是数组变量,不能是列表直接量
pop操作符弹出数组的最后一个元素并从数组中删除
push操作符在数组的末端加入一个或者一串数据
6.shift/unshift操作符shift的操作数和unshift的第一个操作数必须是数组变量,不能是列表直接量
shift操作符弹出数组最左端的第一个元素并从数组中删除
unshift操作符在数组的最左端加入一个或者一串数据
pop/push操作符是对数组的末端处理,而shift/unshift操作符是对数组的最左端进行处理。
7.Foreach中的循环控制变量并不是列表元素的复制品,而是列表元素本身,因此,循环中修改了控制变量,就相当于修改了列表元素。
@colors=qw/redgreenyellowwhiteblack/;
print"TheColorsare@colors.\n";#打印修改前的COLOR
foreach$color(@colors){
$color="\t$color";
$color.="\n";
}
print"TheColorsare:
\n",@colors;
输出结果:
8.默认变量$_
9.reverse操作符使列表或者数组内容反序,但是不能直接修改它本身的参数内容,只能将反序结果传给别的变量。
10.sort操作符按照ASCII的码序,对列表或者数组内容进行排序。
但是不能直接修改它本身的参数内容,只能将排序结果传给别的变量。
11.列表上下文和标量上下文
如果是给列表(不论其元素个数)赋值,则是列表上下文;如果是给标量赋值,则是标量上下文。
举例如下:
标量上下文:
$fred=something;
$fred[3]=something;
123+something
something+456
if(something){}
while(something){}
$fred[something]=something
列表上下文:
给列表赋值或者是作为参数列表时一定是列表上下文
@fred=something;
($fred,$bag)=something;
($test)=something;
push@fred,something;
foreach$fred(something){}
sortsomething
reversesomething
printsomething
在列表上下文中使用产生标量的表达式,如果表达式结果为标量值,则自动产生一个仅含此标量的列表。
undef是标量值,所以将undef赋值给数组时并不会清空该数组,而是产生一个仅有一个未定义元素的列表。
要清空数组或者列表时,直接赋值一个空列表就可以。
@test=undef;
@clear=();
强制指定标量上下文
scalar伪函数
第四章子程序
一.定义子程序
sub子程序名{}
定义时子程序名以字母、数字和下划线组成,有时也可包含“与号”,但是不能以数字开头。
子程序可以重名,但是后面的将覆盖掉前面的子程序。
二.调用子程序
在程序中直接通过子程序名(可以包含“与号”)来调用。
子程序被调用时一定是作为表达式的某一部分。
所有的子程序都会有返回值,就是程序最后执行的表达式的值。
不一定是最后一个语句。
但是如果有return操作符,则会返回某个值,而且退出子程序。
三.参数
Perl子程序可以接收参数,就是在调用时将参数放在子程序名后的括号中,以参数列表的形式传递,并且Perl会自动将参数列表化名为特殊的数组变量@_,该变量只在子程序执行期间有效。
子程序可以访问这个数组,判断参数的个数和具体的值,访问参数元素的方式为:
$_[0],$_[1]…..,但是这些变量和程序的自动变量$_没有任何关系。
访问超出参数个数也无所谓,只是得到undef值而已,多余不用的参数也会自动略去不用。
数组变量@_是每个子程序的私有变量,独自拥有,互不影响,即使有全局的数组变量@_,也不会混淆,各自独立。
四.子程序的私有变量
1.通过my操作符定义子程序的私有变量。
它也可以出现在Perl程序的任何位置,用于定义任何语句块的私有变量。
它只是改变变量的作用域,但是并不能更改变量所处的上下文。
例如:
my($num)=@_;#列表上下文,$num中会被设为第一个参数值
my$num=@_;#标量上下文,$num中会被设为参数个数
定义持久性私有变量state$num=0;
但是,在Perl5.10中,对于数组和哈希类型的state变量,如果处于列表上下文,则不能进行初始化。
目前,在列表上下文环境中初始化state变量是禁止的。
例如:
state@array=qw/abcd/;#错误
2.my操作符后的括号表示了my操作符的操作范围。
如果有括号,则表示改变括号内的所有变量的作用域,如果没有括号,则只是对紧跟它的单个变量起作用。
3.所有新变量的值一开始都是空的:
标量为undef,数组则为空列表。
4.usestrict;编译命令强制执行一些严格的,确保良好程序设计的规则。
第五章输入与输出
一.读取标准输入
1.行输入接收一行输入
行输入特例<>标准输入流
可以在处理程序的调用参数的时侯,使用钻石操作符来读取标准输入流。
可以不是从键盘,而是从客户指定的位置读取。
2.调用参数系统会自动存在特殊数组@ARGV中,其内容是由调用参数组成的列表。
二.标准输出
1.print读取列表中的所有值并输出到标准输出。
在输出中直接使用数组和数组内插方式,输出的效果是不同的。
直接使用数组进行输出时,会将数组的元素一个接着一个的输出,中间没有空白和其他分隔符;而使用数组内插方式时,每个元素之间一定会有一个空白来分隔输出。
例如:
@fred=qw/13579/;
$cnt=@fred;
print"Thenumberscountof(@fred)is$cnt\n";#输出结果为列表的元素个数。
print@fred,"\n";#输出结果:
13579
print"@fred\n";#输出结果:
13579
print(2+3)*4;#输出结果为5.
print((2+3)*4);#输出结果为20.
注意:
如果print后紧跟有左括号,则必须将要输出的内容全部放在右括号之前,否则只会输出括号内的列表内容。
三.格式化输出printf
1.%按照顺序插入参数值
%g输出恰当的数值形式,它会按照需要选择浮点数,整数或者指数等形式
%d输出十进制整数,无条件舍去小数部分,而非四舍五入。
%s字符串内插
%f输出浮点数,可以按照需要四舍五入。
格式为:
%总长度.小数位数f
%%可以输出真正的百分号
printf“Themonthlyinterestrateis:
%.2f%%”,5.25/12;
printf"\nThemonthlyinterestrate:
%.2f%%\n",5.25/12;#Theoutputresultis0.44
printf"\nThemonthlyinterestrate:
%.2f\%\n",5.25/12;#Theoutputresultis0.44
可以指定输出宽度。
宽度为正值,则输出内容右对齐,如果为负值,则输出内容左对齐。
如果超出指定宽度,系统自动扩展。
2.数组和printf
my@colors=qw/redgreenyellowwhiteblack/;
my$format="Iknowthecolors:
\n".("%10s\n"x@colors);
printf$format,@colors;
组合在一起:
标量上下文获取数组长度列表上下文获取数组内容
printf"Iknowthecolors:
\n".("%-10s\n"x@colors),@colors;
四.文件句柄
就是Perl程序中代表本身的Perl进程与外界I/O联系的名字。
它只是这种联系的名字,不一定是文件名。
建议用全大写字母来命名文件句柄,以下6个除外:
STDIN,STDOUT,STDERR,DATA,ARGV和ARGVOUT
五.say操作符
行输出语句,自动输出一行内容并且在最后进行换行。
第五章哈希
所谓哈希,就是一种特殊的数据结构,由哈希键和哈希值一一对应而形成的一批数据。
其中哈希键必须是字符串,而且必须唯一的,不能重复,但是,每个键对应的键值却是可以重复的,而且类型不限。
以哈希键进行存取。
一.访问哈希元素
1.要访问哈希元素,格式如下:
$hash_name{$some_key}哈希变量的命名和别的标识符一样,以字母,数字和下划线组成,不能以数字开始。
哈希赋值
$family_name{“fred”}=“aaaaa”;
$family_name{“merry”}=“jing”;
2.要访问整个哈希变量,用%哈希变量名
哈希赋值:
1)。
%family_name=%name
2)。
胖箭头的使用组成键值对
%family_name=(“A”=>1,“B”=>2,“C”=>3,“D”=>4,)
3)。
通过哈希键来赋值
$family_name{“fred”}=“aaaaa”;
$family_name{“merry”}=“jing”;
二.哈希函数
1.keys和values函数
keys函数获取哈希键,形成哈希键列表
values函数获取哈希值,形成哈希值列表
获取的两个列表中元素顺序不确定,但是这两个列表的各个元素却是一一对应,按顺序生成。
这两个函数在列表上下文中,得到列表,如果在标量上下文中,则得到哈希键的个数。
例如:
%char=("A"=>1,"B"=>2,"C"=>3,"D"=>4,);
@key=keys%char;#ABCD
@value=values%char;#1234
$key1=keys%char;#4
$value2=values%char;#4
2.each函数
获取哈希的每个键值对。
唯一适合用该函数的地方是while语句。
while(($key1,$value1)=each%char){
state$cnt=0;
$cnt+=1;
print"Thehash$cntKey/Valueis:
\n$key1=>$value1\n";
}
哈希中的键值可以是undef,表示虽然有键,但是值却未定义。
3.exists函数
判断某个键在哈希中是否存在,返回真或者假。
与它是否有值无关。
例如:
if(exists$char{"E"}){
print"Thekeyalreadyexists.\n";
}else{
print"Thekeydon’texists.\n";
}
4.delete函数
从哈希中删除该键及其对应的值。
如果存在,直接删除,反之则结束删除动作,即相当于什么也不做,也不报错。
例如:
delete$char{“A”};
delete$char{“E”};
5.哈希值内插
可以将单一的哈希元素内插到双引号引起的字符串中,但是整个哈希的内插是不支持的。
例如:
#哈希元素插入
foreach$person(sortkeys%char){
if($char{$person}){
print"$personhas$char{$person}items.\n";
}
}
6.在双引号中需要转义才能输出本身的符号有:
$@\“
7.%ENV哈希系统内定哈希
print"PATHis$ENV{PATH}\n";
print"TEMPis$ENV{TEMP}\n";
print"TMPis$ENV{TMP}\n";
第六章漫游正则表达式王国
正则表达式和shell的文件名通配(glob)类似,但是不一样,不能混淆。
一.元字符
1.点号.任何单字符通配符,只能匹配一个字符,换行符除外。
\点号.匹配单个点号.
2反斜线\
在任何元字符前加上反斜线\,就会使它失去元字符的特殊功能,只表示字符本身。
3.星号*乘法操作符匹配它前面的内容零次或者任意次,只能是前面的内容重复出现多次或者零次。
4.点星结合.*可以匹配任意字符无限多次。
戏称此组合是捡破烂模式,能够通吃所有字符串。
5.+匹配前一个条目一次以上。
与*不同,星号匹配前一个条目0次或者多次。
6.?
匹配前一个条目一次或者0次。
就是表示前面的条目可以不出现或者只出现一次。
7.()圆括号或者小括号进行模式分组例如:
/(fred)+/fredfredfredfred….
/(fred)*/可以匹配任何字符串,包括空串
8.(。
)\表示反向引用
9.|或择一匹配
二.字符集简写
1.\d代表任意数字的字符集【0-9】
2.\w代表单词字符【A-Za-z0-9_】由字母,数字和下划线组成的标识符。
3.\s代表空白,相当于【\f\t\n\r】,它等于是包含五种空白的字符集:
换页、制表、换行、回车以及空格。
\s*匹配0个或者多个空白
\s+匹配一个以上空白
\h匹配横向空白,等价于【\t】
\v匹配纵向空白,等价于【\f\n\r】
\R匹配任何类型的断行
三.反义简写
^\d=\D
^\w=\W
^\s=\S
/[\dA-Fa-f]+/匹配十六进制数字
/[\d\D]/复合字符集匹配任意字符(包括换行符),匹配任何数字非数字字符
/…/i进行大小写无关的匹配
/…/s可以匹配任意字符,包括换行符
/…/x可以在/…/中加入空白和注释,注释也算空白,但是注释中不要出现匹配的定界符,容易搞混,以为模式的结束。
四.组合选项修饰符
/…/isx先后顺序不影响匹配的结果
五.绑定操作符
=~默认的情况下模式匹配的串是$_,使用绑定操作符,则能让Perl用右边的模式匹配左边的字符串,而非匹配$_。
第八章以正则表达式进行匹配
m//=//
m()m<>m{}m%%m+任何成对的定界符
一.锚位
^字符串开头
$字符串结尾/^\s*$/匹配空白行。
\b单词锚位,匹配任何单词的首尾
\B非单词边界锚位
二.不捕捉模式
(?
:
。
。
。
。
)
三.命名捕捉
(?
使用捕获串时的格式为:
$+{label},举例如下:
##!
c:
/perl/bin/perl-d-w
use5.010;
my$name='FredorBarney';
if($name=~m/(?
\w+)(?
:
and|or)(?
\w+)/){
say"Isaw$+{name1}and$+{name2}.";
}
四.模式测试程序
下面是一个有用的程序,用来检测输入的字符串是否能够被指定的模式检测通过。
可以将所有输入一行行读入,然后以给定的模式去匹配。
如果匹配成功,利用三个特殊的匹配变量($`,$&,$’)进行结果展示,否则会输出不匹配的信息。
#Ctrl+Z退出輸入
while(<>){
chomp;
if(/merry/){#给定的模式
print"Matched:
/$`<$&>$'/.\n";
}else{
print"NoMatch:
|$_|\n";
}
}
第九章用正则表达式处理文本
m/…/模式匹配相当于搜索功能
s/…/…/先进行模式匹配和定位,然后替换。
将前面的替换为后面的。
s/匹配串/替换串/
返回的是布尔值,成功为真,否则为假。
只能进行一次替换动作。
例如:
$_="He'soutbowlingwithBarneytonight.";
print"$_\n";
s/Barney/Fred/;
print"$_\n";
s/…/…/g/g修饰符可以让s/…/…/进行所有可能的、不重复的替换,实现全局替换。
s/\s+//g将任何连续的空白转换为一个空格。
s/^\s+//g删除开头的空白。
s/\s+$//g删除结尾的空白。
s/^\s+|\s+$//g同时删除开头和结尾的空白。
一.不同的定界符
1.s/…/…/有左右之分的,必须用两对,前后可以不一样,但是每对必须一致。
如果用没有左右之分的,用三个就可以。
例如:
s#^https:
//#//http:
//#
s{Merry}{Merry_Jing}
s[Merry]{Merry_Jing}
s#Merry_Jing#
二.可选修饰符
/s/i/x/g是可选修饰符,也可以在替换运算模式中使用,修饰符的顺序不影响替换结果
三.绑定操作符
=~用绑定操作符可以为s/…/…/指定不同的目标
四.大小写转换
以下是在替换模式中可以使用的转义字符,也可以用在双引号内的字符串中。
/U转义字符,会将替换字符串中其后的字符全部转换为大写的。
/L转义字符,会将替换字符串中其后的字符全部转换为小写的。
/E转义字符,结束大小写转换。
/l只会影响其后的第一个字符
/u只会影响其后的第一个字符
/u/L全部转换为小写,但是首字母大写。
五.split操作符
split操作符用拆分模式串“扫过”指定的字符串,匹配成功后返回各个子串列表,拆分模式串的内容则不会出现在各个子串中。
期间只要模式在某处匹配成功,该处就是一个子串的结尾,下一个子串的开头。
如果匹配不成功,则返回原字符串。
如果分隔符连续出现,则会出现空子串。
split操作符在转换后可能出现多个空子串,它保留开始的空子串,但是会省略结尾处的空子串。
例如:
#split操作符