Perl软件学习心得由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“教学软件学习心得”。
Per l 不需要任何特别的文件名字或后缀名,但最好不要使用后缀名
在 Perl 中,注释由# 开始,如果文本的第一行前两个字符是“ #!”,接着的就是执行下面文件的程序。#!行和程序的可移植性相关,需要找到每台机器的存放地点。幸运的是,通常都被放在/usr/bin/perl或/usr/local/bin/perl中。
如果不是这样,则需要找到你自己机器上perl的存放地点,然后使用那个路径。
Perl 中不需要声明变量
Perl 内部没有整数值。程序中的整数被当做等价的浮点数来处理.八进制以 0 开头,十六进制以 0x 开头,二进制 0b 开头。在十六进制中 A 到 F(或者 a 到 f)分别表示 10 到 15.Perl 允许用下划线来分隔61298040283768,因此可以像下面这样书写:61_298_040_283_768加(+),减(-),乘(*),除(/)模数运算符(%)。10%3 的值是 10 除以 3 的余数。两个操作数首先变成它们对应的整数值,如 10.5%3.2 转换为
10%3◆后再计算两个*号表示,如 2**3,表示 2 的 3 次方.由小写的字母 x 表示。这种操作能把操作符左边字符串重复操作符右边数字那么多次。
use warnings一直都需要警告(warning),可以在 #!这一行加上-w,如:#!/usr/bin/perl – w 当程序中包含可能的错误时,可以要求 Perl 警告你
把 use diagnostics 加入程序后通过它可以看到更详细的警告信息
标量变量的名字由一个美圆符号($)后接 Perl 标识符:由字母或下划线开头,后接字母,数字,或者下划线。或者说由字母,数字和下划线组成,但不能由数字开头。大小写是严格区分的。
每一个二元操作符都有一个等价的二元赋值形式:由这个符号后接等号组成。例如,下面两行是等价的:
$fred = $fred + 5;# 没有用二元赋值操作符 $fred+=5;#利用二元赋值操作符 下面的也是等价的: $barney = $barney*3;$barney*=3;上述两例中,变量借助自身而非别的变量来改变自身的值。另一个常用的赋值操作符是字符串连接符号(.);其赋值形式为(.=): $str = str.“”;#$str后接空格 $str.=“”’;#同上
$mean = “ brontosaurus steak”;
$barney = “fred ate a $meal ”;#$barney 现在是“fred ate a brontosaurus steak” $barney = ‘fred ate a’.$meal;#同上
如果一个变量未被赋值,则将使用空值替换$barney = “fred ate a $meat ”;#$barney 现在是“fred ate a ”
在字符串中变量前($符号前)加上反斜线(),变量将不会被内插(替换): $fred = ‘ hello’;
print “ The name is $fred.n”;#打印出美圆符号,变量不会被其值替换 print ‘ The name is $fred’.“ n”;# 同上
花括号({})。用花括号将变量名括起来。或者将字符串分隔成几个部分,再用连接符(.)串起来:
$what = “ brontosaurus steak ”;$n = 3;print “fred ate $n $whats.n”;# 不是 steaks,而是$whats的值 print “fred ate $n ${what}s.n”;# 现在是使用变量$what print “fred ate $n $what”.“ s.n”;#另一种方法
print ‘fred ate ’.$n.‘’.$what.“ s.n ”;#一种复杂的方法
35!= 30+5 #false 35 == 35.0 #true ‘35’eq‘ 35.0’ #false(按照字符串比较)‘fred’ lt ‘barney’ #false ‘fred’ lt ‘free’ #true ‘fred’ eq ‘fred’ #true ‘fred’ eq ‘Fred’ #false ‘’gt ‘’ #true
if($name gt ‘ fred’),print “ ‘ $name’ comes after ‘ fred ’ in sorted order.n”;}else{ print “ ‘ $name’ does not come after ‘ fred’.n”;print “ Maybe it’ s the same string, in fact.n”;}
作为标量值来使用的,Perl 每次从标准输入中读入文本的下一行,将其传给。标准输入可以有很多种;默认的是键盘。中的字符串通常由一个换行符作为结尾。
$text = “ a line of textn”;#也可以由输入 chomp($text);# 去掉换行符(n)。
chomp($text =);#读入,但不含换行符 $text =;chomp($text);#同上,但用两步完成 $count = 0;while($count
defined 函数,它将在为undef时返回 false,其余返回 true $madonna =;I f($defined($madonna)){ print “ The input was $madonna”;} Else { print “ No input available!n”;}
小写的字母 x 表示。这种操作能把操作符左边字符串重复操作符右边数字那么多次: “fred”x 3 # “fredfredfred” 例子2.5将给出换行的事例
数组下标可以是任何能返回数值的表达式。如果其值不为整数,则自动将其转换为小于它的最大整数值:$number = 2.71828;print $fred[$number100]’;#得到‘ bedrock’ , 第 0 个元素 $rocks[-200] = ‘ crystal’;# 严重错误(fatal error!)
数组是由括号括起来并且其元素由逗号分隔开的列表。(1,2,3)# 含有 1,2,3 的列表(1,2,3,)# 同上,最后一个逗号被忽略()# 空列表-0 个元素(1 ..100)# 包含 100 个整数的列表(1 ..5)#同(1,2,3,4,5)(1.7 .. 5 .7)#同上—最小值和最大值被转换成整数(5 ..1)#空列表—..中的左值应小于右值,否则为空(0,2 .. 6,10,12)#同(0,2,3,4,5,6,10,12)($m ..$n)# 由$m 和$n 的值决定(0 .. $#rocks)#上节中有$#rocks 的介绍 用qw表示数组: qw!fred barney betty wilmadino!qw# fred barney betty wilmadino # #有些像注释 qw(fred barney betty wilmadino)qw{fred barney betty wilmadino } qw[fred barney betty wilmadino ] qw @rocks 可以读作“ all of the rocks@rocks = qw / bedrock slate lava /;@tiny =();#空表
@giant = 1..1e5;#包含 100,000 个元素的表
@stuff =(@giant, undef, @giant);#包含 200,001 个元素的表
@rocks = qw / bedrock slate lava /;@tiny =();#空表
@giant = 1..1e5;#包含 100,000 个元素的表
@stuff =(@giant, undef, @giant);#包含 200,001 个元素的表 @copy = @quarry;#将一个数组中的值拷贝的另一个数组中
pop 操作将数组的最后一个元素取出并返回: @array = 5..9;$fred = pop(@array);#$fred得到 9,@array 现在为(5,6,7,8)$barney = pop @array;#$barney gets 8, @array 现在为(5,6,7)pop @array;#@array 现在为(5,6)(7 被丢弃了)
pop 相反的操作是 push,它可以将一个元素(或者一列元素)加在数组的末尾: push(@array,0);#@array 现在为(5,6,0)push @array,8;#@array 现在为(5,6,0,8)push @array,1 ..10;#@array 现在多了 10 个元素 @others =qw/9 0 2 1 0 /;push @array,@others;#@array 现在又多了 5 个元素(共有 19 个)push 的第一个参数或者 pop 的唯一参数必须是数组变量。
unshift和
shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)。下面是一些例子: @array = qw# dinofred barney #;$m = shift(@array);#$m 得到“dino” , @array 现在为(“fred” , “ barney”)$n = shift @array;#$n 得到”fred” , @array 现在为(“ barney”)shift @array;#@array 现在为空
$o = s hift @array;#$o 得到undef, @arry仍为空 unshift(@array,5);#@array 现在为(5)unshift @array,4;#@array 现在为(4,5)@others = 1..3;unshift @array, @others;#array 现在为(1,2,3,4,5)
@rocks = qw{flintstone slate rubble };print “ quartz @rocks limestone n ”;# 输出为 5 种 rocks 由空格分开
$email = “ fred@bedrock.edu”;#错误!将会替换@bedrock $email = “ fred@bedrock.edu”;#正确
$email = ‘ fred@bedrock.edu’;# 另一种方法
只有一个元素的数组的被其值替换的行为和你预期的类似: @fred = qw(hello dolly);$y = 2;$x = “ This is $fred*1+’ s place”;# “ This is dolly’ s place” $x = “ This is $fred[$y-1]’ s place”;# 同上
@fred = qw(eating rocks is wrong);$fred = “ right ”;#我们将打印“ this is right[3] ”
print “ this is $fred[3] n ”;#打印出“ wrong”使用 $fred[3] print “ this is ${fred}[3] n ”;# 打印出“ right”(由花括号分开)print “ this is $fred”.“ [3] n”;#正确(两个字符串,右.分开)print “ this is $fred [3] n”;# 正确(利用反斜线转义)
foreach从列表的第一个元素一直循环执行到最后一个元素,一次迭代一个:
foreach $rock(qw/ bedrock slate lava /){print “ One rock is $rock.n”;#打印出 3 种 rocks
reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回 @fred = 6 ..10;@barney = reverse(@fred);# 得到 10,9,8,7,6 @wilma = reverse 6 .. 10;#同上,没有使用额外的数组 @fred = reverse @fred;#将逆转过的字符串存回去
sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序 @rocks = qw/ bedrock slate rubble granite /;@sorted = sort(@rocks);#得到 bedrock, granite, rubble, slate @back = reverse sort @rocks;#为 slate 到 bedrock @rocks = sort @rocks;#将排序的值写回@rocks @numbers = sort 97 .. 102;# 得到 100,101,102,97,98,99
标量和列表上下文
+ something #something 必须是标量 sort something #something 必须是列表
如果 something 是相同的字符串,在一种情况下,它返回一个变量值,在另一种情况下,它可能返回列表◆。Perl 中的表达式将根据其 context 返回适当的值。
在列表 context 中,它返回反转的列表。在标量 context 中,返回反转的字符串(或者将反转的结果串成一个字符串):
@backwards = reverse qw / yabbadabba doo /;# 返回 doo, dabba, yabba $backwards = reverse qw/ yabbadabba doo /;# 返回oodabbadabbay
函数 scalar它不是一个真实的函数因为其仅是告诉 Perl 提供一个标量 context: @rocks = qw(talc quartz jade obsidian);print “ How many rocks do you have?n”;
print “ I have ” , @rocks, “rocks!n”;# 错误,输出 rocks 的名字 print “ I have ” , scalar @rocks, “ rocks!n ”;#正确,输出其数字
在标量 context 中返回输入的下一行。
@lines =;#将输入读入列表 context 中,输入来源于一个文件时,它将读入文件的剩余部分。Unix 或者类似的系统中,包括linux, Mac OS X,通常可以输入 CTRL +D◆来表明输入已经结束。在 DOS/WINDOWS 系统中,使用 CTRL +Z◆。
所有的 Perl 子程序都会返回值,在 Perl 中返回值和不返回值是没有区别的。当 Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。最后一个被计算的表达式是 print 语句。其返回值通常为 1。用my创建私有变量。使用 my 创建新的,私有数组:my @phone_number。sub max { my($m,$n);#新的,私有变量($m,$n)= @_;#赋值 if($m > $n){$m} else{$n} } my($m,$n)= @_;
hash看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签(key)访问此标签对应的元素(value)$hash{$some_key} $family_name, “ fred”= “ rubble”;
$family_name{“fred” } = “astaire”;# 将新值赋给已经存在的元素
$family_name{ “wilma” } = “flintstone”;#新增一个 key(也包括 value)$family_name{ “ betty” }.= $family_name{“ barney ” };#创建一个新元素 $grantie = $family_name{“larry” };#没有larry:得到undef %some_hash =(“foo”, 35, “bar”, 12.4, 2.5, “hello”, “wilma”, 1.72e30, “betty”, “bye n”);@array_array = %some_hash;%new_hash = %old_hash;将%old_hash展开成 key/value 的列表,再将其赋给%new_hash,其将 key/value 对一个一个加入的。%inverse_hash = reverse %any_hash;
my %last_name =(“fred” => “flintstone”, “dino” =>undef,“barney”=> “rubble”;“betty”=> “rubble”,);上面代码中,很容易辨别出哪一个是 key,哪一个是 value。注意列表中最后一个逗号
my %hash =(“a” =>1, “ b”=>2, “ c ”=>3);my @k = keys %hash;my @v = values %hash;
my $count = keys %hash;#得到 3,是指有 3 个 key/value 对。
each 函数,它将返回 key/value 对的2元素列表。一般只在 while 循环中使用 each: while(($key, $value)= each %hash){ print “ $key => $valuen”;
}while 循环的条件表达式,这是在标量 context 中。列表赋值语句在标量 context 中返回的是元素的个数,在本例中,是2。
each 返回的 key/vlaue对,顺序是混乱的(它其顺序和 keys 和 values 函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用 sort),大致如下: foreach $key(sort keys %hash){ $value =$ha{$key};print “ $key => $valuen”;
#也可以不使用额外的临时变量$value #print “ $key => $hash,key-n”;}
exists 函数,如果 hash 中存在此 key,则返回 true,这和 是否有对应的 value 无关: if(exists $books{$dino}){ print “ Hey, there’ s a libaray card for dino!n ”;}
delete 函数将某个给定的 key(包括其对应的 value)从 hash 中删除。(如果不存在这个 key,则什么也不做;不会有警告或者错误信息。)my $person = “ betty”;
delete $books{$person};#将$person 的借书卡删除掉
在双引号的字符串中使用单个 hash 元素: foreach $person(sort keys %books){ if($books{$person}){ print “ $person has $books{$person} items n ” #fred有3个 } }
正则表达式,在 Perl 中通常被称为模式(pattern):某个模板是否匹配某个字符串.某个给定的模式将这些字符串分成两类:一类是能匹配的,一类是不能匹配的。
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下: $_ = “ yabbadabba doo”;if(/abba/){ print “ It matched!n”;
}模式匹配通常返回 true 或 false,因此经常用在 if 或 while 的条件表达式部分
引入特殊字符的原因,它们被叫做元字符(metacharacters),在正则表达式中具有特殊的含义。点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(“ n ”)。因此,模式/bet.y/将匹配 betty。同时也匹配betsy ,bet=y , bet.y,或者说任意字符串后接 bet, 然后是任意的单个字符(不包括换行符),后接 y。如果只希望点(.)匹配句号,可以使用反斜线。这条规则对 Perl 正则表达式中所有元字符均有效:元字符前使用反斜线将使它变成普通的字符。反斜线是第二个元字符。如果需要真正的反斜线,需要重复使用两个反斜线。
星号(*)表示匹配前一项0次或者多次。.* 将匹配任意多个任意字符(不含换行符)的字符串。加(+)的意思是可以匹配前面一项的一个或多个。问号(?),其含义是前面一个项出现一次,或者不出现。括号(())用来表示分组。例如,模式/fred+/ 能匹配上如fredddddddd,这样的字符串,但这种字符串在实际中没有什么用途。模式/(fred)+/能匹配上像fredfredfred这样的字符串。
竖线(|),在这种用法中通常被读作“或(or)”,意思是匹配左边的或者右边的。
字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的任意一个。字符类前使用符号^将取此字符类的补集。也就是说,[ ^def ]]将匹配上这三个字符中之外的任意单个字符。[^n-z]将匹配上 n,-, z 之外的任何字符。
任何数字的类,[0-9],可以被简写为:d。w 被称作“ word’字符:[A-Za-z0-9_]。
s 对于匹配空白(whitespace)将非常方便。它等价于[ f tnr ],其含 5 个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。使用[^ d] , [^ w], 和[^ s],其含义分别是,非数字的字符,非 word(记住我们对 word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:D, W, S 来完成。[ dD],它的意思是任何数字,和任何非数字,则意指任何字符。
不区分大小写:/I匹配 FRED 时,也能匹配上fred, Fred,可以使用修饰符 /i: print “ Would you like to play a game? ”;chomp($_ =);if(/yes/i){#大小写无关
print “ In that case, I recommend that you go bowling.n”;}
匹配任何字符:/s
b,是针对单词使用的。如/bfred b/可以匹配上单词fred,但不能匹配frederick
符号^(脱字字符◆)表示在字符串的开头进行匹配,而符号$则表示在结尾◆
只想要一个词界锚定,当使用 / bhunt/ 将匹配上像 hunt , hunting , hunter,这样的单词,但不会匹配 shunt,而/stoneb/ 将匹配 sandstone, flintstone,而不能匹配上 capstones。非词界锚定为B。它将在任何非b 匹配的点上进行匹配。因此,模式/bsearchB/将匹配 searches , searching, searched , 但不能匹配 search,或者 researching。
匹配上的那部分字符串将自动存储在$&之中。$`中含有正则表达式引擎在匹配成功前所找到的变量,而$'为此模式还没有匹配的剩余部分。
花括号({}),花括号中有 2 个数字,由逗号隔开,表示前面一项允许重复的次数。模式/a{5,15}/将匹配 5 个到 15 个 a 中的任意一个(包括 5,和 15)。星号(*)等同于{0,},表示 0 个或多个。加号(+)等同于{1,},表示 1 个或多个。而问号(?)则等同于{0,1}。
1.在此优先级表的最顶端是括号:(()),在分组和引用内存值的时候使用。括号内部的任何部分比括号外的部分结合更紧 密。
2.第二级是数量词。这里有星号(*), 加号(+),问号(?)以及由花括号表示的数量词,如{5,15}, {3, }, {5}等。它们通常 和前一项元素结合。3.第三级的是锚定和序列(sequence)。锚定包括(^)表明字符串的开头,($)表明结尾,(b)词界符,(B)非词界符。序列(一
个元素紧接着一个元素)实际上是一种操作,虽然它没有使用元字符。这段话的含义是一个单词中的字母结合更紧密,就 像锚定紧贴字母一样。
4.优先级最低的是竖线(|),表示或。由于其优先级最低,它通常将模式划分成几个部分。它在优先级最底端是因为我们希
望像|/fred|barney/ 里面的字母比或(|)结合更紧密。如果或(|)的优先级比序列的优先级更高, 那么,上述模式的含义是匹配fre, 接着是 d 或者 b , 然后是arney。因此,或(|)的优先级最低,字母序列的优先级要高些。s ///操作的则类似于“查询并替换(search and replace)”。它将替换变量中◆模式所匹配上的部分:$_ = “ He’ s out bowling with Barney tonight.”;s/Barney/Fred/;#Barney 被 Fred 替换掉 print “ $_n”;
如果没有匹配上,则什么也不会发生,此变量也不会有任何更改:s/// 会返回一个 Boolean 值。如果成功替换则返回 true ;否则返回 false。
修饰符/g 要求 s/// 将不相重叠◆的所有匹配上的部分都进行替换: $_ = “home, sweet home!”;s/home/cave/g;print “ $_n”;# “ cave, sweet cave!”;
全局替换的一个常用地方是将多个空格用单个空格替换掉:
$_ = “ Input data t may hav e extra whitespace.”;s/s+/ /g;#现在是“ Input data may have extra whitespace.”
s/^s+//;#将开头的空白去掉 s/s+$//;#将结尾的空白去掉
除了/g 修饰符外◆,替换操作中还可以使用/i , /x, 和 /s,这些在普通的模式匹配中已经出现过的修饰符。
U 要求紧接着的均是大写: $_ = “ I saw Barney with Fred.”;
s/(fred|barney)/U$1/gi;#$_ 现在是“ I saw BARNEY with FRED.”
要求后面的均为小写:L:
s/(fred)|barney/L$1/gi;#$_现在是“ I saw barney with fred.”
split,它根据某个模式将字符串分割开。这对于由制表符分割开,冒号分割开,空白分割 开,或者任意字符分割开的数据是非常有用的◆。任何可在正则表达式之中(通常,是一个简单的正则表达式)指定分离符(separator)的地方,均可用 split。@fields = split /separtor/, $string;split◆将模式同字符串进行比较,将由分离符所分隔开的子串作为列表返回回来 @fields = split /:/, “abc:def:g:h”;#返回(“abc” , “def” , “ g” , “ h”)可能得到空的元素,如果其中有两个分隔符是连在一起的:
@fields = split /:/, “abc:def::g:h”;#得到(“abc” , “def” , “” , “ g” , “ h”)这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃◆空白/ s+/这个模式进行分割是非常常见的。在这个模式下,所有的空白等价于单个空格: my $some_input = “ This is a t test.n”;
my @args = split /s+/, $some_input;#(“ This ” , “ is” , “ a ” , “ test.”)默认时,split 对$_操作,模式为空白: my @fields = split;#同 split / s+/, $_;
join 函数将这些分割的部分组合成一个整体。join 函数类似于: my $result = join $glue, @pieces;join 函数的第一个参数是粘合元素(glue),它可以是任意字符串 my $x = join “ :” , 4, 6, 8, 10, 12;#$x 为“ 4:6:8:10:12”
在fred and barney went bowling last night 上使用/fred.+barney/ 进行匹配.+,它将匹配除了换行符之外的任意字符,次数大于等于一。但,由于加号(+)是贪婪的;它将尽可能的进行匹配。因此,它将匹配剩余的所有字符串
在fred and barney went bowling last night 上使用/fred.+?barney/ 进行匹配 不是使用加号(+), 而是使用非贪婪的数量词 +?,它将匹配一次或 多次(加号的意思),但其匹配尽可能少的次数,而非尽可能多的次数