`
weiyinchao88
  • 浏览: 1180657 次
文章分类
社区版块
存档分类
最新评论

perl 高级特性

 
阅读更多

9.1搜索标量
用index进行搜索
index string,substring
index string,substring,start_position
index函数从string的左边开始运行,并搜索substring.返回找

到substring所在的位置。0是指最左边的字符,如果没有找到s

ubstring,index便返回-1;如:
index "Ring around the rosy","around"; #返回5
index("Pocket full of posies","ket"); #返回3
index "ddd","ff"; #返回-1
index("test test","test",1); #返回5

也可以使用带起始位置的index函数,以以便“遍历”一个字符

串,找到出现一个较短字符串的所有位置,如:
$source = "One fish,two fish,red fish,blue fish.";
$start =-1;
while (($start=index($source,"fish",$start)) !=-1) {
print "Found a fish at $start/n";
$start++;
}


rindex向后搜索 与index基本相同 不过它是从右向左进行搜索

,如:
$a="She loves you yeah, yeah, yeah.";
rindex($a,"yeah"); #返回26.
rindex($a,"yeah",25); #返回20

但它的遍历和index有点不同,它的起点必须从字符的结尾开始

。当然也是递减1而不是加1了,如:
$source = "One fish,two fish,red fish,blue fish.";
$start =length($source);
while (($start=rindex($source,"fish",$start)) !=-1) {
print "Found a fish at $start/n";
$start--;
}

substr分割标量,句法如下:
substr string,offset
substr string,offset,length
substr函数取出string,从位置offset开始运行,并返回从off

set到结尾的字符串的剩余部分,如果设定了length,那么取出

length指明的字符,或者直到找出字符串的结尾,以先到者为

准,如
$a="I do not like green eggs and ham.";
print substr($a,25); #输出 and ham.
print substr($a,14,5); #输出 green"

如果offset为负值,substr函数将从右边开始计数,如substr(

$a,-4)返回$a的最后4个字符;如果length为负值,则substr返

回从它的起点到字符串结尾的值,如
print substr($a,5,-10); #输出 not like green egg

也可以使用赋值表达式左边的substr函数,当用在左边时,sub

str用于指明标量的什么字符将被替换,当用在赋值表达式的左

边时,substr的第一个参数必须是个可以赋值的值,比如标量

变量,而不是应该是个字符串直接量,如下:
$a="countrymen,lend me your wallets";
#第一个字母用"n3tl04d,c"代替
substr($a,0,1)="n3tl04d,c";
#在前面插入"Bl,"
substr($a,0,0)="Bl,";
#替换最后7人字符
substr($a,-7,7)="ears.";

tr///(y///)转换符,句法如下:
tr/searchlist/replacementlist/

tr/abc/xyz/; #In $_,把abc变为xyz
$r=~tr/abc/xyz/; #一样,只是用$r
tr/A-Z/a-z/;
如果replacementlist是空的,或者与searchlist相同,那么tr

///将计算并返回匹配的字符。目标字符串并不被修改,如:
$potato="dldii";
$eyes=$potato=~tr/i//;

#计算在$potato中i的个数,返回$eyes 这里是2
$nums=tr/0-9//; #计算在$_中的数字,返回给$nums 这里是0

printf 功能强大的输出函数,句法如下:
printf formatstring,list
printf filhandle formatstring,list
formatstring是一个描述输出格式的字符串,list是一个你想

让printf显示的值的列表。

%-w.dx
解释:
% 域限定符标记
- 减号(可有可无)有的话输出为左对齐
w 域的总宽度(必须有)
. 小数点(可有可无)
d 小数点后边的位数(可有可无)
x 域类型(必须有)x说明符前面的连字符表示该域在w字符中

左对齐,否则它进行右对齐

只有%和x是不可少的,部分数据(域)类型如下:
c 字符
s 字符串
d 十进制整数,截尾的小数
f 浮点数

部分例子:
printf("%20s","Jason"); #右对齐输" Jason"
printf("%-20s","Small"); #左对齐输出"Small "

$amt=7.12;
printf("%6.2f",$amt); #输出" 7.12"

$amt1=7.127;
printf("%6.2f",$amt1); #输出" 7.13"

printf("%c",65); #输出"A" ASCII码

$amt2=9.4;
printf("%6.2f",$amt2); #输出" 9.40"
printf("%6d%",$amt2); #输入" 9"

同时也可以
printf("%6d %4c",$a,$b);

9.5 堆栈形式
push target_array 将项目压入堆栈
pop target_array,new_list 将项目从堆栈顶部取出
shift target_array 从底部取出元素
unshift target_array,new_list 将元素添加到堆栈的底部

注意堆栈底部为元素0,堆栈顶部是数组中的最后一个元素
例:
@band=qw(trombone);
push @band,qw(ukulele clarinet);

#@band中包含trombonem,ukulele,clarinet

$brass=shift @band; #从底取出trombone
$wind=pop @band; #从顶取出clarinet
#现在@band只有ukulele了
unshift @band,"harmonica"; #从底部添加harmonica

拼接函数 splice ,句法如下:
splice array,offset
splice array,offset,length
splice array,offset,length,list
splice用于删除数组中从offset位置开始的元素,同时返回被

删除的数组元素,如果offset是负值,则从数组的结尾处开始

计数,如果设定length,那么只删除length指定的元素,如果

设定list,则删除指定的元素,并用list的元素取代之。如:
@veg=qw( carrots corn );
splice(@veg,0,1); #@veg is corn
splice(@veg,0,0,qw(peas)); #@veg is peas,corn
splice(@veg,-1,-1,qw(barley,turnip)); #veg is

peas,barley,turnip
splice(@veg,1,1) #@vegis peas,turnip


十、文件与目录
获取目录列表函数
opendir dirhandle,directory;
目录句柄dirhandle应该全部使用大写字母
readdir dirhandle;读取它的内容
closedir dirhandle;关闭
下面是读取一个目录的例子,不包含..和.
opendir(TEST,'/') || die "Cannot open /:$!";
@FILES=grep(!/^/./.?$/,readdir TEST); #去掉..和.
closedir(TEST);
如果要查找有特定扩展名的全部文件,可以使用:
@FFILES=grep(//.txt$/i,readdir(TEST);

注意,readdir返回的文件名并不包含opendir使用的路径,所

以下面例子可能无法运行:
opendir(TEST,'/test') || die "Cannot open /:$!";
while($file=readdir TEST)
open(FILEH,$file) || "Cannot open $file:$!/n";

}

应该改为open(FILEH,"/test/$file") || "Cannot open

$file:$!/n";

另一种读取目录是用globbing,句法如下:
glob pattern
pattern是你要匹配的文件名模式

字符 匹配模式 举例
? 单个字符f?d用于匹配fud、fid和fdd等
*任何数目字符f*d用于匹配fd、fdd和food等
[chars] 任何一个chars f[ou]d用于匹配fod和fud
{a,b, } a或bf*{txt,doc}匹配以f开头且以txt或

doc结尾的文件


创建和删除目录
mkdir newdir,permissions; 创建目录,成功返回真,否则返

回假,并将$!设置为mkdir运行失败的原因。如:
print "Directory to create?";
my $newdir=<STDIN>; chomp $newdir;
mkdir ($newdir,0755) || die "Failed to create

$newdir:$!";

rmdir pathname;删除目录
unlink list_of_files; 删除文件unlink能删除list_of_files

中的所有文件,并返回已经删除的文件数量,如果list_of_fil

es被省略,$_中指定的文件将被删除,要检查文件列表是否已

被删除,必须对想要删除的文件数量与已删除的文件数量进行

比较,如下:
my @files=<*.txt>;
my $erased=unlink @files;

#被删除的文件数量存放在$erased中

if ($erased !=@files) { #与@files元素数量比较,
print "Files failed to erase:",
join(',',<*.txt>),"/n"; #不同,输出没有

被删除的文件
}


rename oldname,newname;

文件改名如果只设定路径,那么rename会将文件从一个目录移

到另一个目录。


chmod mode,list_of_files;更改权限,只在unix中有用,如
chmod 0755,'test.pl';


十一、系统之间的互操作性
1.system()函数,句法如下:
system command;不能捕获输出,如:
system("dir /w");
如要启动一个图形文件编辑器:
system("notpad.exe test.txt");

2.捕获输出
可以使用反引号(``)括起来的任何命令均作为外部的命令来运

行,就象通过system运行的一样,其输出被捕获,并且作为反

引号的返回值 ,如:
$directory=`dir`; #运行dir命令
还有一种可以代替反引号的方法,就是使用qx{},其实也可以

用qx<>,qx(),qx[],如:
$perldoc=qx{perldoc pero};


代码可移植性
查看目录空间
my(@dir,$free);
@dir=`dir`;
$free=$dir[$#dir];
$free=~s/.*([/d,]+) /w+ free/$1/;
$free=~s/,//g;

判断操作系统
if ($^O eq 'MSWIN32') {
#执行window下的代码
} elseif ($^O eq 'linux') {
#招行linux的代码
}


十二、没怎么看

十三、引用和结构
引用有点象指针,如
$ref=/$a; #建立一个引用到$a
$ref中并不包含用于它自己的任何数据,它只是对$a的一个引

用。若要通过$ref来输出$a的值,可以用:
print $$ref;
如果通过引用来修改原始值,可以用:
$$ref="sticks";

对数组的引用也同样
$aref=/@arr;
$$aref[0] @arr的第一个元素,也可以${$aref}[0]
@$aref[2,3]@arr的一个片
@$aref@arr的整个数组

对哈希结构的引用
$href/%hash;
$$href{key}

访问%hash中的一个关键字,也可以是${$href}{key}
%$href访问整个哈希结构,也可以是%{$href}
若要迭代通过该哈希结构,输出所有的值,可以使用:
foreach $key (keys %$href) {
print $$href{key};
}

作为参数的引用

结构
perl不支持二维数组,但可以使用数组的数组,如:
@list_of_lists=(
[qw(11 12 13)],
[qw(21 22 23)],
[qw(31 32);,
);

$list_of_lists[0][1]; #也就是11

要知道最外层列表中的元素数目:
$#list_of_lists;#最后一个是2个元素
scalar(@list_of_lists);#行数是3行

要遍历列表,可以使用下面代码:
foreach my $outer (@list_of_lists) {
foreach my $inner (@{$outer}) {
print "$inner";
}
print "/n";
}

可以添加下面的结构:
push(@list_of_lists,[qw(41 42 43)]);#添加一行
push(@{$list_of_lists[0]},qw(14));#在第一行添加新

元素


十四、模块的使用
其它都是看使用说明就差不多了
最简单的ping
#!/usr/bin/perl -w

use strict;
use Net::Ping;

if (pingecho ("www.163.com",15)) {
print "163 is on the network.";
} else {
print "163 is unreacheable.";
}

diagnostics模块能够帮助你查找程序中的错误。

有关网站
www.cpan.org

十五、了解程序的运行性能

1.DBM文件
DBM文件是已经与一个perl的哈希结构连接起来的文件。若要读

取和写入DBM文件,只需对一个哈希结构进行操作即可,如:
dbmopen(hash,filename,mode)
提供的filename实际上在硬盘上创建两个不同的文件,即filna

md.pag和filename.dir,但不是文本文件。如果是linux系统,

mdoe 一般是0664。例:
dbmopen(%hash,"dbmfile",0664) || die "Can't open DBM

dbfile:$!";

$hash{feline}="cat";
$hash{canine}="dog";#赋值
print $hash{canine};#取出

dbmclose(%hash);#关闭连接

注意:
·关键字和数据长度受限制,虽然哈希结构不受限,关键字和

数据合起来不能超过1024Byte
·运行dbmopen以前的哈希结构中的值均被丢失,最好只使用新

的哈希结构,如下例:
%h=();
$h{dromedary}="camel";
dbmopen(%h,"database",0664) || die "Cannot open:$!";
print $h{dromedary}; #输出为空
dbmclose(%h);
·dbmopen函数执行后,与DBM文件相连接时哈希结构的值将会

消失:

dbmopen(%h,"database",0664) || die "Cannot open:$!";
$h{dromedary}="camel";
dbmclose(%h);
print $h{dromedary}; #输出为空

遍历
dbmopen(%recs,"records",0664) || die "Cannot open:$!";
while ( ($key,$value)=each %recs) {
print "$key=$value/n";
}
dbmclose(%recs);


15.锁定文件,反正就是为了读写出错。
use Fcntl qw(:flock);
flock(FILEHANDLE,lock_type);
lock_type可以使用的一些值:
·lock_SH 这个值要求在文件上设置公用锁
·lock_EX 这个值要求对已经打开而用于写入的文件设置一个

专用锁
·lock_UN 这个值用于释放一个锁,很少用

例,在加锁情况下文本文件的输入/输出
#!/usr/bin/perl -w
use strict;
use Fcntl qw(:flock);

my $semaphore_file="/tmp/list154.sem";

#通用锁函数
sub get_lock {
open(SEM,">$semaphore_file") || die "Cannot

create semaphore:$!";
flock(SEM,LOCK_EX) || die "Lock failed:$!";
}

#通用解锁函数
sub release_lock {
close(SEM);
}

sub readdata {
open(PH,"phone.txt") || die "Can't open

phone.txt $!";
my(@DATA)=<PH>;
chomp(@DATA);
close(PH);
return(@DATA);
}
sub writedate {
my(@DATA)=@_;
open(PH,">phone.txt") || die "Can't open

phone.txt $!";
foreach (@DATA) {
print PH "$_/n";
}
close(PH);
}
my @PHONEL;

get_lock();
@PHONEL=readdata();
push(@PHONEL,"N3tl04d 12345678");
writedate(@PHONEL);
release_lock();

  1. sleep的问题

    在写shell程序的时候,经常想要在某一时刻sleep一段时间,但是unix的sleep命令的时间单位最小是秒,有时候不能满足我们的精度要求。这时候可以调用perl的一个命令,来达到目的。

    perl -e 'select(undef, undef, undef, 0.001);'

    以上表示sleep 0.001秒,也就是1毫秒,select函数最小可以精确到0.000001,也就是1微妙

分享到:
评论

相关推荐

    perl 高级编程教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    perl高级编程中文教程

    .Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。 .与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味...

    PERL编程完整教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    Perl编程24小时教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    perl 24教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    Perl 入门及高级编程

     .Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。  .与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这...

    perl初级教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    Perl脚本参考手册

    .Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。 .与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味...

    perl的编程基础

    .Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。 .与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着...

    PERL编程24学时教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

    Perl编程24学时教程

    第一部分主要讲述Perl的基本概念,第二部分重点介绍Perl的一些高级特性,第三部分介绍如何使用Perl进行CGI编程,第四部分(即附录)讲述如何在不同的操作系统下安装Perl的各个模块。 本书结构清晰,讲解透彻,通俗易懂...

Global site tag (gtag.js) - Google Analytics