Perl入门教程 备忘

(1)数字

双精度浮点型

整数 浮点数

数字操作符 + – * / % **

 

(2)字符串

Unicode和utf-8

单引号和双引号内的字符串

 

(3)字符串操作符

连接操作符

重复操作符

 

(4)数字与字符串之间的转换

Print “123”*3; Print “123s”*3; Print “123s”.3;

 

(5)Perl 的警告信息

Use这个函数用来加载和引用Perl的模块,或者是子程序,

Use warnings; Print “123s”*3; Print “123s”.3;

Print –w test.pl

 

(6)标量变量

容器 变量名称不变,存储内容改变 美元符号:$

 

(7)变量的命名

字母、数字和下划线 全部小写

 

(8)变量的赋值

双目赋值操作符

 

(9)字符串中的标量变量内插

Print “$c”; print $c:

 

(10)操作符的优先级与结合性

直接括号搞定

 

(11)比较操作符和if 控制结构 While (){}

 

==  != > < >= <=

Eq ne gt lt ge le

If (){}

 

(12)布尔值 0 为假 其他都为真

 

(13)获取用户的输入<STDIN>

 

(14)Chomp() 操作符 如果字符串后面有两个换行符?

chomp()(perl5)会删除\n以及后面的所有内容。chop()(perl4)会删除最后一个字符。

 

(15)Undef 值

while ($n<10) { $sum=$sum+1; $n=$n+1; } print $sum ;

 

(16)defined()函数

defined()

 

第三节

(1)标量:数字字符串

单引号和双引号内的字符串

(6)标量变量

容器 变量名称不变,存储内容改变 美元符号:$

(11)if 控制结构 While (){}

比较操作符

获取用户的输入<STDIN>

(14)Chomp() 操作符 如果字符串后面有两个换行符?

(15)Undef 值

(16)defined()函数

 

 

 

 

标量——列表(数据)

标量变量——数组(变量)

数组内可以同时包含数字、字符、undef值

 

数组或列表的索引:

整数,从0开始

 

数组的索引不是整数?舍去小数

 

超过数组尾端的元素进行赋值?

数组的长度无上限,增补的默认为undef

 

数组里最后一个元素的索引值:$#aaa

这个数字比数组内元素的个数少1

 

负数数组索引值:-1

 

数组:@

数组的赋值

@aaa= qw, (), 1..100, @bbb, (@ccc, “abc”,123)

 

数组的初始值:()

变量的初始值:undef

 

将一个数组复制到另外一个数组:列表赋值,

 

 

访问数组中的元素:

$aaa[0]=”aaa”;

 

$aaa和@aaa、$aaa[0]一样吗?

 

列表直接量:圆括号内逗号隔开

范围操作符:..

 

数组内的元素,可以是表达式和变量

($aaa,17)
($a+$b, $c+$d)

 

qw简写:qw(),简洁,当成单引号qw任何标点符号作为定界符
! / #

qw内的转义字符

 

列表的赋值

($a, $b, $c)=(“aaa”,”bbb”,”ccc”)

互换变量
($a, $b)=($b, $a)

 

赋值时左右两边变量的个数不相等?

 

 

 

 

下标超出数组的尾端?undef值

 

字符串中的数组内插

数组变量可以放在双引号内,数组各元素自动添加空格分隔,首尾不会添加空格

 

电子邮件放进双引号内:转义字符或单引号

 

 

 

 

数组操作函数:Perl尽量少用索引,影响速度。

pop和push操作符

新增元素到数组尾端,更高的索引赋值。

 

pop:取出数组最后一个元素返回

@aaa=1:3;

$bbb=pop(@aaa); @aaa是多少?

$ccc=pop @aaa; @aaa是多少?

pop @aaa; @aaa是多少?

与Chop() ;区别

 

Push(@aaa,9);

Push @aaa,9;
不用括号

Push @aaa,1..9;

Push @aaa,@bbb;

 

Pop和push的操作对象是数组,不是列表。

 

Shift和unshift操作符

处理最左边,最前边

$a=shift(@aaa);

$a= shift @aaa;

Unshift (@aaa, 5);

Unshift @aaa, @bbb;

 

Splice操作符

Push-pop和shift-unshift操作首尾

Splice操作中间的元素

 

四个参数,后两个可选,必须有两个

第一个是目标数组,第二是开始位置

@aaa=1..5;

@bbb=splice @aaa,2;

删掉了2以后的,并返回

 

第三个参数:长度,个数,不是位置

删掉一个片段

 

第四个参数是要替换的列表,不一定和删除的一样长

可以不删除,制定位置插入

 

 

 

 

列表和数组

列表是指数据,而数组是其变量名。可以有一些值(列表)但不属于数组;但

每一个数组标量都有一个列表。第一个元素的索引为0.

print $fred[0];
$fred[1]=”test”;

数组中最后一个元素的索引为$#
例如
$rocks[0]=”a”;
$rocks[1]=”b”;
$end = $#rocks;
$number_of_rocks=$end+1;
$rocks[$#rocks]=”last one”;
或者用-1索引最后一个元素
$rocks[-1]=”last one”;

列表
(1, 2, 3)
(1 .. 100)
(5 .. 1)空列表

qw简写:
qw(fred barney betty wilma dino)相当于
(“fred”, “barney”, “betty”, “wilma”, “dino”)
除了用括号作为分界符,还可以用任何标点符号,如:
qw! fred barney !
qw[ fred barney ]

列表赋值:
($fred,$barney,$dino)=(“flintstone”,”rubble”,undef);
可以用来交换两个变量的值
($fred,$barney)=($barney,$fred);

给列表赋值:
($rocks[0],$rocks[1])=qw/talc mica/;
或者
@rocks=qw/talc mica/;
@tiny=(); #空表
@giant=1..1e5;  #包含100,000个元素
@stuff=(@giant,undef,@giant); #包含200,001个元素的表

pop将数组的最后一个元素取出并返回。
@array=5..9;
$fred=pop(@array); #fred=9, @array现在为(5,6,7,8)
pop @array; #@array现在为(5,6,7),8被丢弃

push将一个元素加到数组末尾
push(@array, 0);
push @array, 8;
push @array, 1..10;
@others=qw/9 0 2 1 0/;
push @array, @others;

unshift和shift对一个数组的开头进行操作。
@array=qw# dino fred barney#;
$m=shift(@array); #$m为”dino”, @array为(“fred”,”barney”)
shift @array;
unshift(@array, 5);
unshift @array, 4;  #@array为(4,5);
@others=1..3;
unshift @array,@others; #@array 为(1,2,3,4,5)

数组放入双引号的字符串中,其中的数组元素会自动由空格分开。

对email应该这样定义
$email=”fred\@bedrock.edu”;

$fred=”right”;
print “this is $fred[3]\n”;
print “this is ${fred}[3]\n”;
print “this is $fred”.”[3]\n”;
print “this is $fred\[3]\n”;
输出
this is wrong
this is right[3]
this is right[3]
this is right[3]

foreach控制结构:
foreach $rock(qw/bedrock slate lava/) {
print “one rock is $rock.\n”;
}
其中$rock是控制变量,如果修改了控制变量,那么原始列表也被修改。
在循环结束后,控制变量将恢复原来的值。

@rocks=qw/a b c/;
$rock=”test”;
print “$rock\n”;
print “@rocks\n”;

foreach $rock(@rocks) {
$rock=$rock.”o”;
}

print “$rock\n”;
print “@rocks\n”;
结果为:
test
a b c
test
ao bo co

最常用的默认变量 $_
如果在foreach中省略了控制变量,则使用默认变量$_
foreach (1..10) {
print “$_\n”;
}

或者
$_=”test”;
print;

reverse将列表和数组反转
@fred=6..10;
@barney=rever(@fred);
@wilma=reverse 6 .. 10;
@fred=reverse @fred;

sort排序:大写排在小写前,数字在字符前

标量和列表上下文:
@people=qw/fred barney betty/;
@sorted=sort @people;    列表上下文:barney betty fred
$number=42+@people;   标量上下文 42+3= 45
又比如对于reverse,在列表上下文,反转列表;在标量上下文,反转字符串
@backwards=reverse qw/yabba dabba doo/;  返回doo, dabba, yabba
$backwards=reverse qw/yabba dabba doo/; 返回oodabbadabbay

@wilma=undef;一个元素(undef)
@betty=();空数组,无元素

scalar将列表转成标量
print @people, scalar @people;

比如对STDIN,是标量还是列表,也不同。对于标量,输入一行,回车,就可以

。对列表,要以ctrl+z来表明结尾,回车。
@lines=<STDIN>;
foreach (@lines) {
print $_.”\n”;
}
$line=<STDIN>;
print $line;

读入所有行,不包含换行符
chomp(@lines=<STDIN>);

 

第四节

赋值:

@aaa= qw, (), 1..100, @bbb, (@ccc, “abc”,123)

qw简写:qw(),简洁,当成单引号

 

数组的初始值:()

变量的初始值:undef

 

访问:

$aaa[0]=”aaa”;

下标超出数组的尾端?undef值

 

数组或列表的索引:

整数,从0开始、小数、负数、$#aaa

 

$aaa和@aaa、$aaa[0]一样吗?

 

输出:

字符串中的数组内插

数组变量可以放在双引号内,数组各元素自动添加空格分隔,首尾不会添加空格

电子邮件放进双引号内:转义字符或单引号

 

 

数组操作函数:

Perl尽量少用索引,影响速度。

Pop和push

Shift和unshift操作符

Splice操作符

 

索引表达式

@aaa=qw(a b c d e f g h);

Print $aaa[0];

$b=5; $b=”2*5″;

Print $aaa[$b-1];

 

Foreach控制结构

Foreach $aaa (qw /aaa bbb ccc/) {

Print $aaa.”\n”;

}

控制变量:每次迭代,控制变量$aaa从列表中取出一个值。

 

循环时,控制变量就是列表中本身的值,改变它会改变列表元素的值

$a=”123″;

@aaa=qw(a b c d e f g h);
foreach $a (@aaa){
print “$a”.”\n”;

$a=$a.$a;
}
print “@aaa”.”\n”;
print “$a”;

 

循环结束时,控制变量变回其初始值,如undef

 

Foreach省略控制变量:默认$_变量

@aaa=qw(a b c d e f g h);
foreach (@aaa){
print “$_”.”\n”;
}

 

Reverse操作符

@aaa=1..4 ;

@bbb=reverse(@aaa) ;

赋值的时候,先算右边,再给左边

 

Reverse不会修改原来的数组。

@aaa=qw(a b c d e f g h);
@bbb=reverse(@aaa);
print “@aaa”.”\n”;
print “@bbb”.”\n”;

 

Sort操作符:对字符进行排序

@aaa=(1,5,3,2,4,8);
@bbb=sort(@aaa);
print “@aaa”.”\n”;
print “@bbb”.”\n”;

 

each操作符,每次调用,返回数组的两个值,索引和该元素的值

($aaa, $bbb)=each @aaa

@aaa=qw(a b c d e f g h);
($a,$b)=each @aaa;
print “$a”.” “.”$b”.”\n”;
($a,$b)=each @aaa;
print “$a”.” “.”$b”.”\n”;

 

打印数组的索引和值

@aaa=qw(a b c d e f g h);
while (($a,$b)=each @aaa){
print “$a”.” “.”$b”.”\n”;
}

 

 

@aaa=qw(a b c d e f g h);
$index=0;
foreach (@aaa)
{
print “$index”.” “.$_.”\n”;
$index= $index+1;
}

 

 

标量上下文与列表上下文:同一表达式出现在不同的地方,会有不同的意义。

是数字还是字符,取决于操作符

是标量还是数组,取决于操作符

“12abc”*2,”12abc”.2

 

数组:

在列表上下文中,会返回列表。

在标量上下文中,会返回个数。

@bbb=Reverse @aaa;

$n=@aaa;

 

 

$bbb=Reverse @aaa;

@aaa=qw(123 abc);
$a=reverse @aaa;
print “$a”;

 

强制指定标量上下文

@aaa=qw( a b c d e);
print scalar @aaa;

 

列表上下文中的<STDIN>

$aaa=<STDIN>;
print $aaa;

@aaa=<STDIN>;
print “@aaa”;

数组里去掉换行符

@aaa=<STDIN>;
chomp(@aaa);
print “@aaa”;

 

第五节

为什么要子程序:继承、代码重复利用、定义自己的函数。

 

定义子程序:sub 子程序名 {}

sub print_value {
$a=$a+1;
print $a;
}

 

子程序可定义在程序的任意位置,不需要对子程序进行声明,子程序的定义是全局的。

 

子程序重名时,后面的会覆盖掉前面的。警告会提醒。

 

目前为止,所有的变量都是全局的。

 

 

调用子程序:&+子程序名

$a=10;
&print_value;

sub print_value {
$a=$a+1;
print $a;
}

 

 

返回值:所有的perl都有一个返回值,最后的一个运算结果就是返回值,小心最后一行代码

$a=10;
print 3*&print_value;
sub print_value {
$a=$a+1;
}

 

$a=10;
print 3*&print_value;
sub print_value {
$a=$a+1;
print “5”.”\n”;
}

最后一个print,输出是1,表示成功输出。

最大值:

$value_1=10;
$value_2=5;
print &max_value;

sub max_value {
if ($value_1>$value_2){
$value_1
} else {
$value_2;
}
}

参数:&max_value(10,25)

特殊的数组变量:@_,

第一个参数$_[0],第二个参数$_[1],(与$_无关,$aaa与$aaa[0]区别?)

 

print &max_value(10,25);
sub max_value {
if ($_[0]>$_[1]){
$_[0]
} else {
$_[1];
}
}

 

print &max_value(10,25,100);

print &max_value(10);

 

私有变量:@_

 

子程序的私有变量:防止和其他变量冲突

print &max_value(10,25);
sub max_value {
my ($a,$b);
($a,$b)=@_;
if ($a>$b){ $a;} else {$b;}
}

 

my ($a,$b)=@_;子程序第一行,命名和赋值

 

 

 

 

变长参数列表:

print &max_value(10,25,100);
sub max_value {
if (@_!=2){print “warning”;}else {
my ($a,$b)=@_;
if ($a>$b){
$a;
} else {
$b;
}
}
}

 

print &max_value(10,25,100,1,1000);
sub max_value {
my ($a)=shift @_;
foreach (@_){
if ($_>$a){$a=$_;}
}
$a;}

 

空参数列表

 

my变量的其他用法:

用在程序里,封装变量,防止出错。

my ($a)=@_;

my $a=@_;

 

@a=(1,2,3,4,5);
my ($a)=@a;
print “$a”.”\n”;
my $a=@a;
print “$a”.”\n”;

 

my $a, $b;

my ($a, $b);

my @a;

foreach my $a (@aaa) {}

 

use strict编译命令

use strict;
@a=(1,2,3,4,5);
my ($a)=@a;
print “$a”.”\n”;
my $a=@a;
print “$a”.”\n”;

新变量必须用my

use strict;
my $ab=1;
$a_b=$ab+1;
print $ab;

 

return 操作符:程序停止并返回值

 

use strict;
my @name=qw(chy dtt zxl yzj wy);
my $output=&find_name(“wyy”,@name);
print $output;
sub find_name {
my ($input,@name_list)=@_;
foreach (@name_list){
if ($input eq $_){ return $input;}
}
return “no”;
}

 

省略与号:

不要把定义子程序放在调用语句的后面

防止与内置的函数重名

 

非标量返回值,子程序可以返回数组

use strict;
print &return_array(1,5);
sub return_array {
my ($a,$b)=@_;
if ($a<$b){return $a..$b;}
}

 

持久性私有变量:state

use strict;
use 5.010;
sub return_array {
state $n=0;
$n=$n+1;
print $n;
}
&return_array;
&return_array;

 

第六节

为什么要子程序:继承、代码重复利用、定义自己的函数。

 

定义子程序:sub 子程序名 {}

sub print_value {
$a=$a+1;
print $a;
}

 

 

调用子程序:&+子程序名

 

返回值:所有的perl都有一个返回值,最后的一个运算结果就是返回值,小心最后一行代码

最后一个print,输出是1,表示成功输出。

参数:&max_value(10,25)

特殊的数组变量:@_,

第一个参数$_[0],第二个参数$_[1]

变长参数列表:空参数列表

 

 

子程序的私有变量:防止和其他变量冲突

my ($a,$b)=@_;子程序第一行,命名和赋值

 

my变量的其他用法:

用在程序里,封装变量,防止出错。

my ($a)=@_; my $a=@_;

 

@a=(1,2,3,4,5);
my ($a)=@a;
print “$a”.”\n”;
my $a=@a;
print “$a”.”\n”;

 

use strict编译命令

use strict;
@a=(1,2,3,4,5);
my ($a)=@a;
print “$a”.”\n”;
my $a=@a;
print “$a”.”\n”;

新变量必须用my

use strict;
my $ab=1;
$a_b=$ab+1;
print $ab;

 

return 操作符:程序停止并返回值

 

use strict;
my @name=qw(chy dtt zxl yzj wy);
my $output=&find_name(“wyy”,@name);
print $output;
sub find_name {
my ($input,@name_list)=@_;
foreach (@name_list){
if ($input eq $_){ return $input;}
}
return “no”;
}

 

省略与号:

不要把定义子程序放在调用语句的后面

防止与内置的函数重名

 

非标量返回值,子程序可以返回数组

use strict;
print &return_array(1,5);
sub return_array {
my ($a,$b)=@_;
if ($a<$b){return $a..$b;}
}

 

持久性私有变量:state

use strict;
use 5.010;
sub return_array {
state $n=0;
$n=$n+1;
print $n;
}
&return_array;
&return_array;

 

 

 

 

打开文件:打开句柄

open函数:两个参数

open (文件句柄,”路径”)

 

open(MYTEXT, “e:/perl/text.txt”)

 

关闭文件:关闭句柄

close(MYTEXT);

 

die用法:

open(MYTEXT, “e:/perl/text.txt”) || die ;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open”;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;

 

读取文件:<>

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
$line=<MYTEXT>;

print $line;

 

标量变量:一行的输入 $line=<MYTEXT>;

 

读取和输出整个文件:

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
while (defined($line=<MYTEXT>)){
chomp $line;
print $line;
}

 

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
while (<MYTEXT>){
print $_;
}

读取并存入数组:

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
@line=<MYTEXT> ;
print “@line”;

print $line[0];

 

写入文件:

open(MYTEXT,”>路径”) || die “$! \n”;

open(MYTEXT,”>>路径”) || die “$! \n”;

>:原有数据删除,写入新的数据

>>:不删除原有数据,添加到原数据结尾

open(MYTEXT, “>>e:/perl/output.txt”) || die “cannot output:$! \n”;
print MYTEXT “abc”;
close(MYTEXT);

 

完成了句柄的写入操作后,必须关闭句柄。close();写入句柄后并不保存到硬盘,而是在缓存里,关闭表示写入磁盘。

 

句柄与输出之间没有逗号

print MYTEXT, “abc”;

 

文件复制程序:

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
open(OUTPUT, “>>e:/perl/output.txt”) || die “cannot output:$! \n”;
while (<INPUT>){
$a=$_;
print OUTPUT $a.$a;
}

 

文件复制程序2:数组写入文件

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
open(OUTPUT, “>>e:/perl/output.txt”) || die “cannot output:$! \n”;
@a=<INPUT>;
print OUTPUT @a;

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
open(OUTPUT, “>>e:/perl/output.txt”) || die “cannot output:$! \n”;
print OUTPUT <INPUT>;

 

 

 

 

重要的文件操作函数:split

数组=split(/分隔符/,标量);

@data=split(/\t/,$data);

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
$a=<INPUT>;
@data=split(/ /,$a);
print $data[0];

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
$a=<INPUT>;
@data=split(/!/,$a);
print $data[1];

 

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
open(OUTPUT,”>e:/perl/output.txt”)|| die “$!”;
$a=<INPUT>;
@data=split(/!/,$a);
foreach (@data) {
$_=$_.$_.”\n”;
print OUTPUT $_;
}

 

 

open(INPUT, “e:/perl/aaa.txt”) || die “cannot output:$! \n”;
open(OUTPUT,”>e:/perl/output.txt”)|| die “$!”;
while (<INPUT>) {
$a=$_;
@data=split(/\t/,$a);
if ($data[3]==1){
print OUTPUT $a;

}
}

 

第七节

打开文件:打开句柄

open函数:两个参数

open (文件句柄,”路径”)

open(MYTEXT, “e:/perl/text.txt”)

 

open(MYTEXT,”<e:/perl/aaa.txt”);

open(MYTEXT,”<“,”e:/perl/aaa.txt”);

open MYTEXT,”<“,”e:/perl/aaa.txt”;

 

 

关闭文件:关闭句柄

close(MYTEXT);

 

 

读取文件:<>

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
$line=<MYTEXT>;

print $line;

 

标量变量:一行的输入 $line=<MYTEXT>;

 

读取和输出整个文件:

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
while (defined($line=<MYTEXT>)){
chomp $line;
print $line;
}

 

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
while (<MYTEXT>){
print $_;
}

读取并存入数组:

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;
@line=<MYTEXT> ;
print “@line”;

print $line[0];

 

写入文件:

open(MYTEXT,”>路径”) || die “$! \n”;

open(MYTEXT,”>>路径”) || die “$! \n”;

>:原有数据删除,写入新的数据

>>:不删除原有数据,添加到原数据结尾

open(MYTEXT, “>>e:/perl/output.txt”) || die “cannot output:$! \n”;
print MYTEXT “abc”;
close(MYTEXT);

 

$aaa=”OUT.txt”;
open MYTEXT,”<“,”e:/perl/aaa.txt”;
open OUTPUT,”>”,”e:/perl/$aaa”;
while (defined($a=<MYTEXT>)){
chomp $a;
print OUTPUT $a;
}

 

 

完成了句柄的写入操作后,必须关闭句柄。close();写入句柄后并不保存到硬盘,而是在缓存里,关闭表示写入磁盘。

 

句柄与输出之间没有逗号

print MYTEXT, “abc”;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

来自钻石操作符的输入 <>

e:/perl aaa.txt bbb.txt ccc.txt

open(MYTEXT,”e:/perl”);
while (defined($a=<>)){
chomp $a;

print $a;
}

while(<>){

chomp;

print $_;

}

E:\perl>perl test.pl aaa.txt bbb.txt ccc.txt

 

调用参数:<>会首先查看@ARGV数组,决定用哪些文件名

open(MYTEXT,”e:/perl”);
@ARGV=qw(aaa.txt bbb.txt ccc.txt);
while (defined($a=<>)){
chomp $a;
print $a;
}

 

日常应用:同时处理合并多个文件

 

标准输出print需要注意的地方:

print() 通常省略括号;

print (2+3)*4;
$result=print (2+3)*4;
print $result;

 

printf 的格式化输出:百分比符号开头%,

d: decimal

$a=4;

printf “%6d”,$a/3;

printf “%6d”,1000000;

 

printf “%6s”,”aaa”;

printf “%-6s”,”aaa”;

 

printf “%.2f”,$a/3;

 

转换的数目和列表的数目一致

printf “%.2f%%,%d”,$a/3,$a/3;

 

数组和printf

通常不用数组做print的参数。

 

用say来输出:默认输出的行尾加换行符

use
5.010;
print “aaa”;
print “aaa”;
say “aaa”;
say “aaa”;

say OUTPUI “aaa”;写入句柄

 

 

 

 

用die处理致命错误

die用法:

open(MYTEXT, “e:/perl/text.txt”) || die ;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open”;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;

open (MYTEXT,”<“,”e:/perl/aaaaa.txt”)|| die “$!”;

$!:可读的系统错误信息,解释性的系统错误信息保存在特殊变量$!中。

 

warnings 不会终止程序,die停止程序。

 

自动检测致命错误:use autodie;

use autodie;
open (MYTEXT,”<“,”e:/perl/aaaaa.txt”);

 

 

标量变量中的文件句柄:

open ($bbb,”<“,”e:/perl/aaa.txt”);
while (defined($a=<$bbb>)){
chomp $a;
print $a;
}

 

 

 

重要的文件操作函数:split

数组=split(/分隔符/,标量);

@data=split(/\t/,$data);

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
$a=<INPUT>;
@data=split(/ /,$a);
print $data[0];

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
$a=<INPUT>;
@data=split(/!/,$a);
print $data[1];

 

 

open(INPUT, “e:/perl/text.txt”) || die “cannot output:$! \n”;
open(OUTPUT,”>e:/perl/output.txt”)|| die “$!”;
$a=<INPUT>;
@data=split(/!/,$a);
foreach (@data) {
$_=$_.$_.”\n”;
print OUTPUT $_;
}

 

 

open(INPUT, “e:/perl/aaa.txt”) || die “cannot output:$! \n”;
open(OUTPUT,”>e:/perl/output.txt”)|| die “$!”;
while (<INPUT>) {
$a=$_;
@data=split(/\t/,$a);
if ($data[3]==1){
print OUTPUT $a;

}
}

 

第八节

用die处理致命错误

die用法:

open(MYTEXT, “e:/perl/text.txt”) || die ;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open”;

open(MYTEXT, “e:/perl/text.txt”) || die “cannot open:$! \n”;

open (MYTEXT,”<“,”e:/perl/aaaaa.txt”)|| die “$!”;

$!:可读的系统错误信息,解释性的系统错误信息保存在特殊变量$!中。

 

warnings 不会终止程序,die停止程序。

 

自动检测致命错误:use autodie;

use autodie;
open (MYTEXT,”<“,”e:/perl/aaaaa.txt”);

 

哈希

数组以数字作为索引,哈希以字符串作为索引。

哈希的索引称为键(key),唯一的字符串。

哈希里没有顺序,存储着键-值对应的集合。

 

哈希赋值

%home=(‘aaa’,1,’bbb’,5,’ddd’,3,’ccc’,2);
print $home{‘ccc’};
$home{‘ccc’}=100;
print $home{‘ccc’};

 

%home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
print $home{aaa};

 

哈希的常用函数和用法:

展开哈希:

@aaa=%home;
print “@aaa”;

 

Reverse 哈希:

%aaa=reverse %home;
@bbb=%aaa;
print “@bbb”;

 

Keys和values函数

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
my @k=keys %home;
my @v=values %home;
print “@k”;
print “\n”;
print “@v”;

 

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
my $k=keys %home;
print “$k”;

 

each函数

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
@aaa=sort keys %home;
print “@aaa\n”;
foreach (@aaa){
$value=$home{$_};
print $_.” “.$value.”\n”;
}

 

 

 

 

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
while (($key,$value) = each %home){
print $key.”\t”.$value.”\n”;
};

 

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);
while (($key,$value) = each %home){
if ($key eq “aaa”){
print $key.”\t”.$value.”\n”;
}
};

 

 

 

 

exists函数

my %home=(aaa => 1,bbb => 5,ddd => 3,ccc => 2);

if (exists $home{‘aaa’}){
print $home{‘aaa’};
}

 

delete函数和哈希元素内插

 

第九节

第七章 漫游正则表达式王国

正则表达式(regular expression)在Perl里也叫模式(pattern),表示匹配某个字符串的特征模版。

 

查看一个字符串,判断他匹配还是不匹配。

 

使用简单的模式

使用一对斜线//匹配$_中的内容。

$_=”aa bb cc”;
if (/aa/){
print “yes aa!”;
}

 

模式匹配的返回值通常为真或假,因此广泛用在if while 的条件表达式中。

 

\p{Space}

\p{Digit}

 

元字符:正则表达式中特殊含义的字符

 

点号:.能匹配任意一个字符的通配符,换行符除外。

$_=”abcd defg”;
if (/b.d/){
print “yes”;
}

 

\. \\:反斜线转义

 

简单的量词

星号*:匹配它前面的内容零次或多次。

 

$_=”abcd\t\t\t\tdefg”;
if (/d\t*d/){
print “yes”;
}

 

.*:匹配任意字符零次到无限次。

$_=”abcdokokokdefg”;
if (/d.*d/){
print “yes”;
}

加号+:匹配它前面的内容一次以上:

$_=”abcd defg”;
if (/d +d/){
print “yes”;
}

 

问号?:它前面的内容出现一次或没有。

$_=”abcd defg”;
if (/d ?d/){
print “yes”;
}

 

模式分组

圆括号():对字符串分组,也是元字符

/heilongjiang+/

/(Heilongjiang)+/:>=1 or >0

/(Heilongjiang)*/:>=0

/(Heilongjiang)?/:1 or 0

 

捕获组:利用反向引用来引用括号中模式所匹配的文字,写法为反斜线后面接数字,\1、\2等,相应的数字表示对应顺序的捕获组。

 

$_=”bcdd”;
if (/(.)\1/){
print “yes”;
}

 

$_=”okok”;
if (/(ok)\1/){
print “yes”;
}

 

$_=”youokok meokok”;
if (/you(….) me\1/){
print “yes”;
}

 

反向引用的分组:

$_=”youokok meokok”;
if (/(.)(.)\1\2/){
print “yes”;
}

反向引用的新写法:

$_=”youoo meokok”;
if (/(.)\111/){
print “yes”;
}

 

 

use 5.010;
$_=”youoo meokok”;
if (/(.)\g{1}/){
print “yes”;
}

 

use 5.010;
$_=”youoo meokok”;

if (/(.)\g{-1}/){

print “yes”;
}

 

择一匹配:

|”或”:匹配左边或右边的模式

 

$_=”abc bcd edf”;
if (/bcc|cdc|df/){
print “yes”;
}

 

$_=”abc bcd edf”;
if (/c( |\t)+b/){
print “yes”;
}

 

$_=”abc \tbcd edf”;
if (/c( +|\t+)b/){
print “yes”;
}

 

字符集

方括号[]:一组可能出现的字符,只匹配单个字符,方括号内的任意一个。

[abcdef]中的任意一个

$_=”abc bcd edf”;
if (/[fgg]/){
print “yes”;
}

 

可以用连字符(-)简写

$_=”abc bcd edf”;
if (/[a-z A-Z]/){
print “yes”;
}

 

第十节

 

点号:.能匹配任意一个字符的通配符,换行符除外。

星号*:匹配它前面的内容零次或多次。

.*:匹配任意字符零次到无限次。

加号+:匹配它前面的内容一次以上:

问号?:它前面的内容出现一次或没有。

模式分组

圆括号():对字符串分组,也是元字符

/heilongjiang+/

/(Heilongjiang)+/:>=1 or >0

/(Heilongjiang)*/:>=0

/(Heilongjiang)?/:1 or 0

 

捕获组:利用反向引用来引用括号中模式所匹配的文字,写法为反斜线后面接数字,\1、\2等,相应的数字表示对应顺序的捕获组。

反向引用的新写法:\g{1}

|”或”:匹配左边或右边的模式

 

字符集

方括号[]:一组可能出现的字符,只匹配单个字符,方括号内的任意一个。

[abcdef]中的任意一个

$_=”abc bcd edf”;
if (/[fgg]/){
print “yes”;
}

 

可以用连字符(-)简写

$_=”abc bcd edf”;
if (/[a-z A-Z]/){
print “yes”;
}

 

字符集的简写

\d 匹配一个数字[0-9]

\w 匹配一个字母、数字或下划线字符,相当于[a-zA-Z_0-9]

\s 匹配一个空字符 [\n \t]

\D 非数字

\W 非[a-zA-Z_0-9]

\S 表示匹配非空白字符

 

$_=”abc bcd edf”;
if (/[\s]/){
print “yes”;
}

 

 

用m//进行匹配

m// /() m {} m<>

$_=”abc bcd edf”;
if (m![\s]!){
print “yes”;
}

 

绑定操作符=~:默认情况下模式匹配的操作对象是$_,=~可以拿右边的模式匹配左边的字符串,而不是$_。

$aaa=”aaa -5.28 aaa”;
if ($aaa=~/aaa/){
print “yes”;
}

 

模式中的内插:正则表达式内部可进行双引号形式的内插。

$b=”aaa”;
$aaa=”aaa -5.28 aaa”;
if ($aaa=~/$b/){
print “yes”;
}

 

模式匹配修饰符:追加在模式表达式末尾定界符后面的字母。

/a 按照ASCⅡ码范围匹配字符

 

/i:大小写无关

$_=”abc bcd edf”;
if (/[A-Z]/i){
print “yes”;
}

 

/s:匹配任意字符,(.)无法匹配换行符,/s可以匹配包括换行符的任意字符。

$_=”abc\nbcd edf”;
if (/c(.)b/s){
print “yes”;
}

 

/x 加入空白符 空白符:/s和/t

 

$_=”aaa -5.28 bbb”;
if (/-? [0-9]+ \.? [0-9]*/x){
print “yes”;
}

 

$_=”aaa -5.28 bbb”;
if (/-? \d+ \.? \d*/x){
print “yes”;
}

 

组合选项修饰符:多项修饰符可连在一起,写在模式末尾,不区分顺序。如//six

 

锚位:在字符串指定位置进行匹配

\A:匹配字符串的绝对开头

$_=”aaa -5.28 bbb”;
if (/\Aa/){
print “yes”;
}

 

\z:匹配字符串的绝对末尾

$_=”aaa -5.28 bbb”;
if (/b\z/){
print “yes”;
}

 

\Z:匹配末尾,允许后边出现换行符

$_=”aaa -5.28 bbb\n”;
if (/b\Z/){
print “yes”;
}

 

/\A\s*\Z/:匹配一个空行,可以包含空白符。

 

 

^ $ /m

 

单词锚位:\b,匹配任何单词的首尾

/\baaa\b/:只能匹配aaa,无法匹配baaa和aaab,类似于整词匹配

 

\b匹配的是字母、数字、下划线组成的字符串。

$_=”aaa -5.28 aaa”;
if (/\baaa\b/){
print “yes”;
}

 

/\baaa\B/

 

 

捕获变量:圆括号内匹配到的字符串,保存在$1、$2等变量中。

 

$_=”abc def,ghi”;
if (/\s([a-zA-z]+),/){
print $1;
}

 

$_=”hello there, neighbor”;
if (/(\S+) (\S+), (\S+)/){
print “$1 $2 $3”;
}

 

捕获变量的存续期:捕获变量存储到下次成功的匹配为止,为防止覆盖,可存储到其他变量里。

$_=”123″;
if (/([0-9]+)/){
}
if (/([2-3]+)/){
}
print “$1”;

 

不捕获模式 (?:)

$_=”hello there, neighbor”;
if (/(?:\S+) (\S+), (\S+)/){
print “$1 $2 $3”;
}

 

命名捕获:

?<key>存储到$+{key}中

 

use 5.010;
$_=”aaa or bbb”;
if (/(?<str1>\w+) or (?<str2>\w+)/){

print “$+{str1} $+{str2}”;
}

 

自动捕获变量:$& $` $’

$`:匹配之前的部分

$’:剩下的未匹配的部分

$&:匹配到的部分

$_=”aaa bbb, ccc”;
if (/\s(\w+),/){

print “$&”;
}

 

通用量词

/a{5,15}/ 匹配出现5到15次a

/a{5, }/ 匹配出现超过5次a

/\w{5}/ 正好5个单词字符的字符串

 

$_=”aaa bbb, ccc”;
if (/(a{1,4})/){
print “$1”;
}

 

优先级

第一位 ()

第二位 量词

第三位 锚位和序列

第四位 择一竖线 |

第五位 原子 单独的字符 字符集和数字等

 

第十一节

点号:.能匹配任意一个字符的通配符,换行符除外。

星号*:匹配它前面的内容零次或多次。

.*:匹配任意字符零次到无限次。

加号+:匹配它前面的内容一次以上:

问号?:它前面的内容出现一次或没有。

\d 匹配一个数字[0-9]

\w 匹配一个字母、数字或下划线字符,相当于[a-zA-Z_0-9]

\s 匹配一个空字符 [\n \t]

\D 非数字

\W 非[a-zA-Z_0-9]

\S 表示匹配非空白字符

 

 

 

用m//进行匹配

m// /() m {} m<>

$_=”abc bcd edf”;
if (m![\s]!){
print “yes”;
}

 

绑定操作符=~:默认情况下模式匹配的操作对象是$_,=~可以拿右边的模式匹配左边的字符串,而不是$_。

 

模式中的内插:正则表达式内部可进行双引号形式的内插。

 

模式匹配修饰符:追加在模式表达式末尾定界符后面的字母。

/a 按照ASCⅡ码范围匹配字符

 

/i:大小写无关

$_=”abc bcd edf”;
if (/[A-Z]/i){
print “yes”;
}

 

/s:匹配任意字符,(.)无法匹配换行符,/s可以匹配包括换行符的任意字符。

$_=”abc\nbcd edf”;
if (/c(.)b/s){
print “yes”;
}

 

/x 加入空白符 空白符:/s和/t

 

$_=”aaa -5.28 bbb”;
if (/-? [0-9]+ \.? [0-9]*/x){
print “yes”;
}

 

$_=”aaa -5.28 bbb”;
if (/-? \d+ \.? \d*/x){
print “yes”;
}

 

组合选项修饰符:多项修饰符可连在一起,写在模式末尾,不区分顺序。如//six

 

锚位:在字符串指定位置进行匹配

\A:匹配字符串的绝对开头

$_=”aaa -5.28 bbb”;
if (/\Aa/){
print “yes”;
}

 

\z:匹配字符串的绝对末尾

$_=”aaa -5.28 bbb”;
if (/b\z/){
print “yes”;
}

 

\Z:匹配末尾,允许后边出现换行符

$_=”aaa -5.28 bbb\n”;
if (/b\Z/){
print “yes”;
}

 

/\A\s*\Z/:匹配一个空行,可以包含空白符。

 

^:行首 $:行尾 /m:多行匹配

 

单词锚位:\b,匹配任何单词的首尾

/\baaa\b/:只能匹配aaa,无法匹配baaa和aaab,类似于整词匹配

 

\b匹配的是字母、数字、下划线组成的字符串。

$_=”aaa -5.28 aaa”;
if (/\baaa\b/){
print “yes”;
}

 

/\baaa\B/

 

 

捕获变量:圆括号内匹配到的字符串,保存在$1、$2等变量中。

 

$_=”abc def,ghi”;
if (/\s([a-zA-z]+),/){
print $1;
}

 

$_=”hello there, neighbor”;
if (/(\S+) (\S+), (\S+)/){
print “$1 $2 $3”;
}

 

捕获变量的存续期:捕获变量存储到下次成功的匹配为止,为防止覆盖,可存储到其他变量里。

$_=”123″;
if (/([0-9]+)/){
}
if (/([2-3]+)/){
}
print “$1”;

 

不捕获模式 (?:)

$_=”hello there, neighbor”;
if (/(?:\S+) (\S+), (\S+)/){
print “$1 $2 $3”;
}

 

命名捕获:

?<key>存储到$+{key}中

 

use 5.010;
$_=”aaa or bbb”;
if (/(?<str1>\w+) or (?<str2>\w+)/){

print “$+{str1} $+{str2}”;
}

 

自动捕获变量:$& $` $’

$`:匹配之前的部分

$&:匹配到的部分

$’:剩下的未匹配的部分

$_=”aaa bbb, ccc”;
if (/\s(\w+),/){

print “$&”;
}

 

通用量词

/a{5,15}/ 匹配出现5到15次a

/a{5, }/ 匹配出现超过5次a

/\w{5}/ 正好5个单词字符的字符串

 

$_=”aaa bbb, ccc”;
if (/(a{1,4})/){
print “$1”;
}

 

优先级

第一位 ()

第二位 量词

第三位 锚位和序列

第四位 择一竖线 |

第五位 原子 单独的字符 字符集和数字等

 

第九章

用正则表达式处理文本

 

用s///进行替换

s# # # s{}{} s{}()

$aaa =~ s///;

 

$_=”aaa bbb ccc”;
if (s/aaa/ddd/){
print $_;
}

 

$_=”aaa bbb ccc”;
if (s/\s(\w+)\s/ $1 $1 /){
print $_;
}

 

用/g进行全局替换 /g /gsix

$_=”aaa bbb ccc”;
if (s/(\w+) (\w+)/$2 $1/){
print $_;
}

 

$_=”aaa bbb aaa”;
if (s/aaa/ddd/g){
print $_;
}

 

替换缩减空白

$_=”aaa bbb \taaa”;
if (s/\s+/ /g){
print $_;
}

 

去除行首尾空白

$_=” aaa bbb aaa”;
if (s/\A\s+//g){
print $_;
}

 

$_=” aaa bbb aaa”;
if (s/^\s+//g){
print $_;
}

 

$_=”aaa bbb aaa “;
if (s/\s+\z//g){
print $_;
}

 

$_=”aaa bbb aaa “;
if (s/\s+$//g){
print $_;
}

 

$_=” aaa bbb aaa “;
if (s/^\s+|\s+$//g){
print $_;
}

 

无损替换

$word=”aaa bbb aaa”;
$word_copy=$word;
$word =~ s/aaa/ddd/g;
print $word.”\n”;
print $word_copy.”\n”;

 

$word=”aaa bbb aaa”;
($word_copy=$word) =~ s/aaa/ddd/g;
print $word.”\n”;
print $word_copy.”\n”;

 

$word=”aaa bbb aaa”;
$word_copy=$word=~ s/aaa/ddd/g;
print $word.”\n”;
print $word_copy.”\n”;

 

$word=”aaa bbb aaa”;
$word_copy=$word=~ s/aaa/ddd/gr;
print $word.”\n”;
print $word_copy.”\n”;

 

大小写转换

$word=”aaa abcd aaa”;
$word=~ s/aaa (\w+) aaa/\U$1/;
print $word;

 

$word=”aaa ABCD aaa”;
$word=~ s/aaa (\w+) aaa/\L$1/;
print $word;

 

$word=”aaa ABCD aaa”;
$word=~ s/aaa (\w+) aaa/\l$1/;
print $word;

 

$word=”aaa abcd aaa”;
$word=~ s/aaa (\w+) aaa/\u$1/;
print $word;

 

$word=”aaa abcd aaa”;
$word=~ s/aaa (\w+) (\w+)/\U$1 \E$2/;
print $word;

 

split函数

$word=”aaa,bbb,ccc”;
@word_1=split(/,/,$word);
print “@word_1”;

 

$word=”aaa,bbb,,ccc”;
@word_1=split(/,/,$word);
print “@word_1”;

 

$word=”,,,aaa,bbb,ccc”;
@word_1=split(/,/,$word);
print “@word_1”;

 

默认的分隔是/\s+/

@word =split;

 

join函数

 

$word=”aaa,bbb,ccc,,,”;
@word_1=split(/,/,$word);
print “@word_1\n”;
$word_2=join(“,”,@word_1);
print “$word_2\n”;

 

列表上下文中的m//

$_=”hello world, I am lucy”;
/(\w+) (\w+),/;
print “$1\n”;
print “$2\n”;

$_=”hello world, I am lucy”;
($a,$b)=/(\w+) (\w+),/;
print “$a\n”;
print “$b\n”;

 

$_=”hello world, I am lucy”;
@a=/(\w+) (\w+),/;
print “@a\n”;
print “$a[0]\n”;
print “$a[1]\n”;

 

$_=”hello world, I am lucy”;
%a=/(\w+) (\w+),/;
print $a{hello};

 

$_=”hello world, I am lucy”;
@a=/(\w+)/g;
$a=@a;
print “@a\n”;
print “$a”;

 

更强大的正则表达式

非贪婪量词:提高效率

@a=1..100;
$_=”@a”;
print $_.”\n”;
if (/1.+5/){
print “yes”;
}

if (/1.+?5/){
print “yes”;
}

 

非贪婪量词:更准确的匹配

$_=”aaa bbb ccc ddd”;
($a)=/\s(.*?)\s/;
print $a;

 

跨行的模式匹配

 

第十二节

第十章 其他控制结构

 

unless 控制结构:条件为假的时候才执行代码,类似于else结构

否定操作符 !

 

elsif结构:逐一测试条件表达式

if(){}elsif{}elsif{}else{}

 

$a=4;
if ($a<3){
print “yes”;
}

 

$a=4;
if ($a<3){
} else {
print “yes”;
};

 

$a=4;
if (!($a < 3)){
print “yes”;
};

 

伴随unless的else字句

unless{}else{};

 

until控制结构

until:循环一直执行,直到条件为真。

 

$a=1;
while ($a<5){
print “yes\n”;
$a=$a+1;
}

 

$a=10;
until ($a<5){
print “yes\n”;
$a=$a-1;
}

 

表达修饰符

$n=2;
print “yes” if $n<5;

 

$n=2;
print ” “, ($n+=1)while $n<5 ;

 

裸块控制结构

定义只有在{}内起作用的临时变量

my $root=100;
{
my $r=2;
my $root=sqrt $r;
print $root.”\n”;
}
print $root;

 

自增与自减

$a=$a+1;

$a+=1;

$a++;

 

$a=$a-1;

$a-=1;

$a–;

 

自增的值

前置自增:++操作符写在变量前面,先增加后取值

后置自增:++操作符写在变量后面,先取值后增加

 

$a=1;
$b=1;
$c=++$a;
$d=$b++;
print “$c $d”;

 

如果不提取值,$a++ 和++$a是一样的。

 

for控制结构

$sum=0;
for ($i=1;$i<=10;$i++){
$sum=$sum+$i;
}
print $sum;

 

for ($_=”abcdefg”;s/(.)//;){
print “$1\n”;
}

 

for ($_=”abcdefg”;;){
print “$1\n”;
}

 

foreach和for之间的关系

foreach和for是等价的,perl根据圆括号里的内容判断,有两个分号就是for,没有就是foreach。

@a=1..10;
for(@a){
print “$_\n”;
}

 

循环控制

Perl的五种循环块:for foreach while until 裸块

last操作符:作用于最内层的循环

next操作符:跳到循环的最低端,然后继续运行下一次循环,也是作用于最内层循环

redo操作符:跳到当前循环的顶端,不仅过测试,也不跳到下一次的循环

 

@a=1..10;
foreach (@a){
if ($_==5){
next;
}
print “$_\n”;
}

 

@a=1..10;
foreach (@a){
$_=$_+1;
print “$_\n”;
if ($_==5){
redo;
}
}

带标签的块

@a=1..10;
LABLE: foreach (@a){
if ($_==5){
last LABLE;
}
print “$_\n”;
}

 

条件操作符?:

如果条件为真,执行冒号前的表达式,如果为假,执行冒号后的表达式。

 

$a=10;
$a>5 ? print “yes” : print “no”;

 

逻辑操作符

逻辑与&& 逻辑或||

短路逻辑操作符:走捷径,可以不用计算右边的值就知道真假

 

$a=10;
if ($a>9||($a++)<15){
print “$a”;
}

 

$a=10;
if ($a>9|($a++)<15){
print “$a”;
}

 

$a=10;
if ($a>100&&($a++)<150){
}
print “$a”;

 

$a=10;
if ($a>100&($a++)<150){

}
print “$a”;

 

第十三节

unless 控制结构:条件为假的时候才执行代码,类似于else结构

否定操作符 !

elsif结构:逐一测试条件表达式

 

伴随unless的else字句

unless{}else{};

 

until控制结构

until:循环一直执行,直到条件为真。

表达修饰符

$n=2;
print “yes” if $n<5;

 

裸块控制结构

定义只有在{}内起作用的临时变量

 

自增与自减

 

自增的值

前置自增:++操作符写在变量前面,先增加后取值

后置自增:++操作符写在变量后面,先取值后增加

 

如果不提取值,$a++ 和++$a是一样的。

 

for控制结构

 

foreach和for之间的关系

foreach和for是等价的,perl根据圆括号里的内容判断,有两个分号就是for,没有就是foreach。

 

循环控制

Perl的五种循环块:for foreach while until 裸块

last操作符:作用于最内层的循环

next操作符:跳到循环的最低端,然后继续运行下一次循环,也是作用于最内层循环

redo操作符:跳到当前循环的顶端,不仅过测试,也不跳到下一次的循环

 

带标签的块

@a=1..10;
LABLE: foreach (@a){
if ($_==5){
last LABLE;
}
print “$_\n”;
}

 

条件操作符?:

如果条件为真,执行冒号前的表达式,如果为假,执行冒号后的表达式。

 

$a=10;
$a>5 ? print “yes” : print “no”;

 

逻辑操作符

逻辑与&& 逻辑或||

短路逻辑操作符:走捷径,可以不用计算右边的值就知道真假

 

$a=10;
if ($a>9||($a++)<15){
print “$a”;
}

 

$a=10;
if ($a>9|($a++)<15){
print “$a”;
}

 

$a=10;
if ($a>100&&($a++)<150){
}
print “$a”;

 

$a=10;
if ($a>100&($a++)<150){

}
print “$a”;

 

 

 

 

第十一章 Perl模块

CPAN:Comprehensive Perl Archive Network

http://www.cpan.org/

寻找模块:

两种来源:与Perl一同发行已经安装好的,从CPAN下载自己安装的

 

查看系统上是否已经安装过模块CGI.pm:

perldoc CGI (终止查看用ctrl+c)

 

列出所有已经安装的模块:

cpan –a

 

安装模块

Windows系统下:

手动安装:

 

网络直接安装:

Strawberry perl:cpan install 模块名

Activeperl:ppm install模块名

 

 

安装到自己的目录

使用简易模块

仅选用模块中的部分函数

处理日期和时间的模块

 

数据库和DBI模块

cpan install DBI

cpan install DBD

 

 

 

 

 

 

 

 

 

 

 

 

 

第十二章 文件测试

 

文件测试操作符

测试文件是否已经存在:

if (-e “aaa.txt”){
die “file already exist!” ; # or warn

}else{
print “ok go on”;
}

$a = -e “a_1.txt”;
print $a;

 

-M:返回文件最后一次修改到程序运行时的间隔天数

-A:返回文件最后一次被访问到程序运行时的间隔天数

 

$a = -M “a_1.txt”;
print $a;

 

-s:返回文件大小 单位是字节byte

$a = -s “aaa.txt”;
print $a;

 

测试同一文件的多个属性:逻辑表达式 and or && ||

if (-M “lcx.doc” >90 && -s “lcx.doc” >1000){
print “yes”;
}

上述程序在运行时会测试文件两次,耗费资源,利用虚拟文件句柄_,只需要测试一次。

 

if (-M “lcx.doc” >90 && -s _ >1000){
print “yes”;
}

 

虚拟文件句柄_也可以用在两个if中,但要注意是否_已经被别的文件测试覆盖。

if (-M “lcx.doc” >90 ) {
print “yes”;
}

if (-s _ >1000){
print “yes”;
}

 

栈式文件测试操作符:靠近文件名的先执行,从右往左执行,一般用于返回布尔值的文件测试中,其他返回值的容易出错。

use 5.010;

if (-r -w “lcx.doc”){
print “yes”;
}

 

stat和lstat函数

@aaa=stat(“lcx.doc”);
print “@aaa”;

 

localtime函数

$mydate=localtime;
print “$mydate”;

 

按位运算操作符

使用位字符串

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第十三章 目录操作

 

在目录树中移动

程序运行时默认在当前的目录下运行。

chdir操作符可以改变当前的工作目录

chdir”e:/perl” ||die”$!”;
open(MYTEXT,”aaa.txt”)||die”$!”;
print <MYTEXT>;

 

文件名通配 glob操作符

 

use strict;
chdir”e:/perl” ||die”$!”;
my @flie=glob “*.txt”;
print “@flie”;

@file取得目录内所有.txt结尾的文件并按字母顺序排序,不包括点.号开头的文件。

 

如果一次性处理多种文件,可写多个模式

my @flie=glob “*.txt *.pl”;

 

文件通配名的另一种语法:<> 代替glob

use strict;
chdir”e:/perl” ||die”$!”;
my @flie=<*.txt *.pl>;
print “@flie”;

 

注意<>里的可能是文件句柄而不是文件名

 

目录句柄

opendir readdir closedir

opendir(MYFILE,”e:/perl”)||die”$!”;
foreach(readdir MYFILE){
print “$_\n”;
}
closedir(MYFILE);

 

递归访问目录

 

文件和目录的操作

删除文件

unlink操作符:删除文件,返回值为删除的数目

unlink “aaaaaaaa.txt”;
opendir(MYFILE,”e:/perl”)||die”$!”;
foreach(readdir MYFILE){
print “$_\n”;
}
closedir(MYFILE);

 

unlink glob “*”:一次删除多个文件

$a=unlink glob “*.doc”;
opendir(MYFILE,”e:/perl”)||die”$!”;
foreach(readdir MYFILE){
print “$_\n”;
}
closedir(MYFILE);
print $a;

 

重命名文件

 

rename “oldname”,”newname”;

rename “oldname”=>”newname”;

rename”aaaaaa.txt”,”bbbbbb.txt”;
opendir(MYFILE,”e:/perl”)||die”$!”;
foreach(readdir MYFILE){
print “$_\n”;
}
closedir(MYFILE);

 

批量修改文件的名字(后缀):构建循环

链接与文件

 

创建目录

mkdir “aaa”,0755 || warn”$!”;

0755:八进制、代表目录权限的值

 

删除空目录

rmdir “aaa” || die “$!”;

 

删除非空目录

rmdir “aaa” || die “$!”;

先用unlink glob “*” 移除目录内所有文件

 

修改权限 修改隶属关系 修改时间戳

 

 

 

第十四章 字符串与排序

用index查找字符串:返回整数表示子字符串出现的相对位置或跳过的字符数

index(主字符串,子字符串,查找位置)

$aaa=”hello world”;
$loca=index($aaa,”hell”);
print $loca;

 

$aaa=”helloworld”;
$loca=index($aaa,”l”,4);
print $loca;

 

rindex 从字符串末尾开始找

$aaa=”helloworld”;
$loca=rindex($aaa,”l”);
print $loca;

 

$aaa=”helloworld”;
$loca=rindex($aaa,”l”,3);
print $loca;

 

用substr操作子字符串

子字符串=substr(字符串,起始,长度)

$aaa=”hello world”;
$loca=substr($aaa,0,3);
print $loca;

 

$loca=substr($aaa,1,100);

$loca=substr($aaa,1);

$loca=substr($aaa,-2,2);

 

$aaa=”hello world”;
substr($aaa,0,5)=”goodbye”;
print $aaa;

 

$aaa=”hello world”;
substr($aaa,0,5)=”goodbye”;
substr($aaa,-5)=~s/world/student/;
print $aaa;

 

$aaa=”hello world”;
substr($aaa,0,5,”goodbye”);
substr($aaa,-5,5,”student”);
print $aaa;

 

用sprintf格式化字符串

用sprintf格式化金额数字

 

$aaa=sprintf “%.2f”,2.49999;
print $aaa;

 

高级排序