Perl学习笔记2
Eddy0825
1:perl与C语言的不同:
A:整数与浮点数均被看作双精度浮点数。
B:对于长的整数,perl用下划线来分隔,如:123456,可以表示为
123_456。
C:perl中NULL没有特殊的含义,不能靠null来判断字符串是否结束。
D:perl变量,数组使用前无须声明,但函数使用前需要声明。
E:空的控制语句如if,不能省略{ },而c语言可以。
F:perl无Boolean类型,真假原则如下:
如值为数字,0为false,其余为真。
如值为字符串,则空串(‘’)为false,其余为真。
特殊之处:perl将0与‘0’相同对待。
G:交换变量的值:
($fred,$barney) = ($barney,$fred),而C语言需要临时变量。
H:数组直接拷贝:
@copy = @quarry;#将一个数组中的值拷贝到另一个数值中。
2:单引号双引号区别:
单引号字符串中的/n不会被当作换行符来处理,其仅仅是两个字符/和n。只有在反斜线/后面接的是/或单引号’时,其才会被当作特殊字符使用。
串联操作符:.
字符串重复操作符(string repetition operator):由小写的字母x表示,把操作符左边的字符串重复操作符右边数字那么多次数。
3:perl warnings
可以在命令行用-w参数打开警告:
$perl –w my_program
打开警告提醒的方法:
UNIX:#! /usr/bin/perl –w
WINDOWS:#! Perl –w
获得更多的诊断信息:
#! /usr/bin/pelr
use diagnostics; #diagnostics(诊断)
4:字符串变量知识:
当一个字符串由双引号括起来时,如果变量前面没有反斜线,其变量值将被内插,即字符串中的变量被其值代替。
其中:单独一个变量,引号没有意义。
Print “$fred”;等价于print $fred;
5:字符串的比较运算符
相等: eq
不等: ne
小于: lt
大于: gt
小于或等于:le
大于或等于:ge
6: chomp操作:
功能:去掉字符串结尾的换行符。
举例:chomp(#text =<STDIN>);#读入,但不含换行符
注:如结尾有两个或两个以上的换行符,chomp仅去掉一个。
7:Pop与Push操作:对数组的末尾进行操作。
pop操作将数组的最后一个元素取出并返回。
Push操作将一个元素或一列元素加在数组的结尾。
形式如下:pop(数组变量);push(数组变量,添加的元素)
举例:@array = 5..9;
$fred = pop(@array);#$fred得到9,@array为(5,6,7,8)
push(@array,0);#@array变为(5,6,7,8,0)
与pop/push相似,shif/unshift操作符对一个数组的开头进行操作。
8:标量与列表上下文(重点)
上下文:即表达式存在的地方。
标量与列表的区别:
举例: $fred = something; #标量context
@pebbles = something; #列表context
($Wilma,$sjej) = something; #列表context
($fred) = something; #列表context (注意与第一个区别)
如在reverse,在列表context中,返回反转的列表;在标量context中,返回反转的字符串
函数scalar:强制将列表context转换为标量context。
9:定义子程序(subroutine):使用关键字sub,子程序的名字(无&这个符号)
sub marine
{
$n+=1;
print “Hello,sailor numners $n!/n”;
}
子程序调用的规则:计算每一步的值,返回子程序中最后计算的值。
且子程序的定义是全局的。
子程序的调用方法:&marine;(*)
10:最大值程序:
$maximum = &max(3,5,10,4,6);
sub max
{
my($max_so_far) = shift @_; //从参数数组@_中取出
foreach (@_) //foreach循环遍历@_剩下的值
{
if($_>max_so_far) //循环中默认控制变量为$_,第一次循环$_为5
{
$max_so_far = $_;
}
}
$max_so_far;
}
创建私有变量的方法:my,如:my($m,$n);
my操作不会改变赋值残暑的context.
注:use strict; #迫使程序采取严格的检测
11:<>输入操作符:程序如下,
while(<>)
{
chomp;
print “It was $_ that I saw!/n”;
}
其中,chomp使用了默认参数,没有变量时,chomp将对$_操作。
<>通常被用来处理所有的输入。
12:区别程序:
打印数组与内插一个数组是不同的。
@array = qw /fred barney betty/;
print @array; #打印出元素的列表
print “@array”; #打印一个字符串(包含一个内插的数组)
第一个输出:fredbarneybetty
第二个输出:fred barney betty(由空格分开)
13:当print调用的方法看起来是函数调用,它就是函数调用。
Print原则:
当print后面无括号时,print是一列表调用。
当print后面有括号时,print为函数调用,输出括号中的内容。
如:print (2+3)*4;
表示:输出5,将print的返回值1乘以4,结果被丢弃。
14:数组与printf:
my @items = qw( Wilma dino pebbles);
my $format = “The items are:/n”.(“%10s/n”x@items);
printf $format,@items;
等价于:
printf “The items are:/n”.(“%10s/n”x @items),@items;
其中,@items使用了两次,一次在标量context中,取其元素的个数;一次在列表context中取元素。
注:x操作符:确定字符串要重复的次数。
15:文件句柄(filehandle):是程序I/O连接的名字,不是文件的名字。
Perl自带了六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
文件句柄的打开:
open CONFIG,”dino”
打开名为CONFIG的文件句柄,指向dino文件。默认是输入。
open CONFIG,”<dino”;
功能同上,<明确指明:使用这个文件进行输入操作。
open BEDROCK,”>fred”;
打开文件句柄BEDROCK,输出到新文件fred中。
open LOG,.”>>logfile”;
>>打开一个文件,数据追加到文件后面。
Perl 5.6版本以后支持三参数的文件格式:
Open CONFIG,”<”,”dino”;
Open BEDROCK,”>”,$file_name;
16:关闭文件句柄:
close BEDROCK;
die函数:
die函数创建自己的严重错误,打印出给定的错误信息,die自动将程序的名字和行数输出在消息的末尾。
If(!open LOG,”>>logfile”)
{
die “Cannot create logfile:$!”;
}
注:其中的$!指系统产生的一些可读的信息。
Select操作符:改变默认的输出句柄。
注:关于文件句柄的重新打开,只有perl成功的重新打开新的连接,否则不会关闭以前的连接。
17:哈希(hashes)
哈希元素的提取:
$hash{$some_key}
注:此处下标(key)使用的是花括号{},key的表达式是字符串,而不是数字,且key必须是唯一的。
引用整个hash:使用%号作为前缀。
Hash的值(在列表context)是一个key/value对的列表。
大箭头符号:(=>),用于识别key与value
举例:my %last_name =
{
“fred” => “flintstone”,
“betty” => “rubble”,
}
18:哈希函数:
A:keys与values函数
Keys返回此hash中所有的keys,values函数返回所有的values.
My %hash = (“a”=>1,”b”=>2,”c”=>3);
My @k = keys%hash;
My @v =values%hash;
在标量context中:
my $count = keys%hash;#返回hash中元素的个数。
B:each函数(通常用在while循环中)
While(($key,$value) = each %hash)
{
print “$key =>$value/n”;
}
C:exists函数:查看hash中是否存在某个key
If(exists $books{$dino})
{
print “Hey,there’s a libaray card for dino!/n”;
}
D:delete函数:从hash中删除某个key
My $person = “betty”;
Delete $books {$person};#将$person的借书卡删除掉
E:hash元素的内插:用于在双引号的字符串中使用单个元素。
Foreach $person (sort keys %books)
{
if($books{$person})
{
print “$person has $books{$person} items/n”
}
}
19:正则表达式(regular Expessions):在perl中也称为模式(pattern).
注:and与or在正则表达式中不是操作符,仅仅是个单词。
点(.)通配符:可以匹配任何单个的字符,不包括换行符(“/n”).
*:表示匹配前一字符0次或者多次。
.*:能匹配任何字符串(除了换行符)。
+:可以匹配前面的字符一次或多次。
?:匹配前面的字符一次或0次。
|(竖线):匹配左边或右边的。
[]:匹配括号内出现的任意单个字符。
/d:任意数字的类,[0-9]。
/w:称为word字符,[A-Za-z0-9],注/w不能匹配单词,只能匹配单个字符,
word由字母,数字。下划线组成。
/s:匹配空白(whitespace),等价于:[/f/t/n/r]
20:正则表达式中可选的修饰符:
/i:不区分大小写
/s:匹配任何字符
/x:添加空格
/b:词界锚定,针对单词的。
=~:绑定操作符,告诉perl将右边的模式在左边的字符串上进行匹配,而不是对$_匹配。
如:print “Do you like Perl?”;
my $likes_perl = (<STDIN> =~//byes/b/I); #括号可以省去,=~优先级高
…… #Times passes…
if($likes_perl)
{
print “You said earlier that you like Perl,So…/n”;
}
匹配变量:
$_ = “Hello there,neighbor”;
if(//s(/w+),/) #匹配空格和逗号之间的词
{
print “the world was $1/n”;#the world was there
}
21:perl中提供的三个自动匹配的变量:$&,$`,$’
如:if(”Hello there,neighbor” =~//s(/w+),/)
{
print “That was ($`)($&)($')”;
}
输出的消息为:(Hello)(there,)(neighbor).
其中:$&保存整个被匹配的部分,$`保存匹配部分的前一部分。
$'保存匹配部分的后一部分。
22: 正则表达式处理文件
全局替换:
$_ = “home,sweet home!”;
s/home/cave/g;
print “$_/n”; #“cave,sweet cave!”;
其他举例:
s//s+/ /g; #将多个空格用单个空格代替。
s/^/s+//; #将开头的空白去掉
s//s+$//; #将结尾的空白去掉
s/^/s+|/s+$//g; #去掉开头结尾的空白
大小写转换:
$_ = “I saw Barney with Fred.”;
s/(fred|barney)//U$1/gi; #$_现在是:I saw BARNEY with FRED.
/U:转换大写
/L:转换小写
/u/L:第一个字符大写,其他字符均小写。
23: 加号的非贪婪类型是:+?,星号的非贪婪类型是:*?
贪婪类型是:.+ 贪婪类型是:.*
更新文件:
#! /sur/bin/perl –w
use strict;
chomp (my $data =‘date’);
#获取系统的当前时间,更好的方法是localtime函数
# my $date = localtime;
$^I = “.bak”;
while(<>)
{
s/^Author:.*/Author:Randal L. Scharwartz/;
s/^Phone:.*/n//;
s/^Date:.*/Date:$date/;
print;
}
24:perl控制语句:
unless:除非条件为真。
elsif:注意只有一个e
next:结束本次循环,进行下一次循环。
redo:继续执行本次循环
last:立及结束循环,等同于C语言中的break语句。
Perl实现了C中所有的操作符。
举例:?:三目运算符,利用?:编写分支程序小技巧:
my $size =
($width<10)?”small”:
($width<20)?”medium”:
($width<50)?”large”:
“extra_large”; #default
25:文件检验
文件检验操作:
如:die “Oops! A file called ‘$filename’ already exists./n”
if –e $filename;
# -e选项检测是否存在相同名字的文件。
其他常见的选项有:
-M:修改的时间
-T:文本文件
-B:二进制文件
-A:访问的时间
-s:文件或目录存在,大小大于0(值为文件的大小,字节)
例:将文件移动备份磁带
my @original_files = qw/ fred barney betty Wilma pebbles dino
bam-bamm/;
my @big_old_files;
foreach(@original_files)
{
push @big_old_files,$_
if (-s)>100_100 and –A_>90;#比下面的效率高
#第一次检测使用了默认的变量$_.
#第二次检测使用_这个文件句柄。
#if –s $filename >100_100 and –A$filename >90;
}
26:目录操作:
chdir:改变工作目录(等价于Unix中的cd)
chdir “/etc” or die “cannot chdir to /etc:$!”;
globbing:将文件名模式转换成它所匹配的文件名
my @all_files = glob “*”;
#@all_files得到了当前目录下的所有文件,安字母排序,不包括由点.开头的文件
等价于Unix中的echo命令
目录句柄:
打开:Opendir,读:readdir.关闭:closedir
删除文件:
unlink,删除文件(Unix中用rm删除文件)
unlink glob “*.o”;
#删除所有文件后缀为.o的文件,unlink返回值为成功删除的文件数。
重命名文件:
rename,(Unix中用mv命令)
rename “old”,”new”;
连接与文件:
link函数。创建一个新的连接。
创建删除目录:
mkdir,创建新目录。
Mkdir “fred”,0755 or warn “cannot make fred directory:$!”;
#0755,表示目录设置的初始权限。
rmdir:删除目录
修改权限:
chmod,与Unix相似
chmod 0755,”fred”,”barney”;
#chmod返回其成功改变的个数。
改变所有者:
chown:改变一批文件的所有者及所在的组。
如:My $user = 1004;
My $group = 100;
Chown &user,$group,glob “*.o”;#两者同时修改
改变时间戳:
utime函数
my $now = time;
my $ago = $now-24*60*60;
utime $now,$ago,glob “*”;
27:字符串与排序
使用索引寻找字串
$where = index($big,$small);
#返回第一个字符的位置,字符位置从0开始。
rindex:返回字符最后一次出现的位置。
使用substr操作字串
$part = substr($string,$initial_position,$length);
三个参数:一个字符串,一个从0开始编号的初始位置,以及字串的长度。
返回一个子串
my $mineral = substr(“Fred J.Flintstone”,8,5);
#得到”Flint”
my $long =”some very long string”;
my $right = substr($long,index($long,”l”));
#返回字符串中字母l后的子串
继续举例:
my $string = “Hello,world!”;
substr($string,0,5) = “Goodbye”;
#$string现在变为“Goodbye,world!”;
substr($string,-20) =~s/fred/barney/g;
#将字符串最后20个字符串中的fred改为barney