Perl语言程序应用(资料汇总版)
Posted 微生态与微进化
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl语言程序应用(资料汇总版)相关的知识,希望对你有一定的参考价值。
Perl语言最初是为文件体系处理而创作的一种多用途语言,Perl试图填补低级语言(如C、C++或汇编语言)和高级语言(如shell编程)之间的空白,使其既满足快速编程,又具有灵活的文本处理功能。Perl的思想是相同目的可有不同方法,代码更加灵活,但也增加了阅读与学习难度。假如你的团队拥有Perl基础,也即积累了大量Perl脚本,你可以花数周的时间掌握Perl的基础,以便充分利用团队平台(对话框回复Perl即可索取学习资料)。假如没有这个前提,建议学习Python作为主要工具,Perl可初步学习作为辅助。
为了更加方便、快捷的实现某些功能,Perl拥有很多其他的控制结构,这些结构也许不是必需的,但可以使程序更加简洁和具有逻辑性。
⑴判断结构
①unless控制结构
unless (condition) {
command;
}
#这个结构等效于if (!(condition)) {command},此外还有unless else结构,如下所示:
unless (condition) {command1} else {command2}
#其相当于:
if (condition) {command2} else {command1}
②elsif控制结构
chomp(my $n = <STDIN>);
if (! defined $n) {
print "The value is undef. ";
} elsif ($n =~ /^d+$/) {
print "The value is an integer. ";
} elsif ($n =~ /^d*.d+$/) {
print "The value is a floating number. ";
} elsif ($n =~ /^s*$/) {
print "The value is empty. ";
} else {
print "The value is an string. ";
}
理论上来说,中间elsif模块的数量是没有限定的。
⑵循环结构
①until控制结构
until控制结构意为直到某个条件为真(也即当条件为假),一直循环执行某个模块命令,可以看成while控制结构的互补结构。Perl中的until结构语句如下所示:
until (condition) {
command;
}
这个结构等效于while (!(condition)) {command}。
②for控制结构
Perl语言中的for循环和其他语言如C、R类似,相比while循环更加完善,包含关键字(for)、三个控制条件(初始化、条件、递归变化)和模块,语句结构如下所示:
for (初始化;条件;变化) {
command;
}
#一个具体示例如下所示:
for ($i = 1; $i <= 10; $i++) {
print "I can count to $i! ";
}
for ($_ = "bedrock"; s/^(.)//; ) {
print "One character is: $1 ";
}
在for循环中,替换操作(注意实际上是$_ =~ s/^(.)//)依次替换$_中的首字母,直至全部替换完毕退出循环,运行如下所示:
在Perl中for循环和foreach循环是等价的,当控制条件只为一个列表时,for循环实际上就是foreach循环,也即关键字foreach可以直接写成for。
⑶表达式修饰符
为了使脚本更加简洁,Perl将控制结构简化为修饰符放在表达式语句后面,来控制该表达式的运行,常见的如if、unless、while、until、foreach修饰符,如下所示:
print "$n is a negative number. " if $n < 0;
#该语句为下面if控制结构的简化:
if ($n < 0) {
print "$n is a negative number. ";
}
#此外还有类似的:
print "$n is not a negative number. " unless $n < 0;
$n *= 2 until $n > 10;
print "It's a small number", ($n += 2) while $n < 10;
&greet($_) foreach @person;
⑷裸块控制结构
没有关键字或条件表达式的代码块被称为裸块(naked block)。例如如下循环结构:
while (condition) {
command;
}
#现在去掉关键字while和条件表达式condition,就会得到一个裸块:
{
command;
}
⑸自增自减
在控制结构尤其是循环结构中常常用到变量的自增与自减,需要用到自增操作符(++,变量加1)与自减操作符(--,变量减1),如下所示:
my $n = 3; #变量初始化
$n++; #$n变为4
$n--; #$n又变为3
变量自增/减也可以用来对变量进行赋值,分为前置自增/减和后置自增/减,如下所示:
my $m = 5;
my $n = ++$m; #前置自增,先自增后赋值,得$n为6,$m为6
my $n = $m++; #后置自增,先赋值再自增,得$n为6,$m为7
自减的规律与自增相同。自增可以放在foreach循环中用来判断已经出现过的条目,如下所示:
my @people = qw/ fred barney wilma dino barney betty pebbles /;
my %seen;
foreach (@people) {
print "I've seen you somewhere before, $_! " if $seen{$_}++;
}
运行结果如下所示:
⑹结构控制
Perl是一种结构化的编程语言,因此需要多样化的结构控制方法,例如对多个循环结构选择执行,或是控制循环结构的执行次数。
①循环控制操作符
循环控制操作符位于循环结构内,用于搭配判断结构来控制循环的退出、选择、返回等,常见的循环控制操作符有以下三个:
last:在某个条件下立即终止循环的执行跳出循环,类似于C、R中的break;
next:在某个条件下立刻结束当前这次循环迭代,进入下一次循环迭代;
redo:重新执行当前循环该次迭代,直到满足某个条件,这常用来纠正用户输入错误。
next示例如下所示:
while (<>) {
foreach (split) {
$total++;
next if /W/;
$valid++;
$count{$_}++;
}
}
print "Total strings = $total, valid words = $valid ";
foreach $word (sort keys %count) {
print "$word was seen $count{$word} times. ";
}
②模块标签
LINE: while (<>) {
WORD: foreach (splid) {
last LINE if /END/;
next WORD if /w/;
}
}
③条件操作符
条件操作符?:就像一个if-else结构,是一个三目操作符,使用格式如下所示:
expression ?if_true_comd : if_false_comd
my $size =
($width < 10) ? "small" :
($width < 20) ? "medium" :
($width < 50) ? "large" :
"extre-large";
这就像一个三层嵌套的if-elsif-else结构。
④逻辑操作符
if (expr1 && expr2) {} #两个表达式都为真则执行模块
if (expr1 || expr2) {} #两个表达式至少一个为真则执行模块
在Perl的不断发展过程中,世界各地的用户为了解决各种棘手问题,积累了大量已经成熟的开源Perl模块,多半可以在Perl综合典藏网(CPAN,https://metacpan.org/)上下载安装,这与R语言的软件包概念是类似的。
⑴模块下载安装
perl Makefile.PL INSTALL_BASE=/home/tengwenkai/perl5/lib
上述模块实际上是使用MakeMaker封装,使用Perl自带的ExtUtils:: MakeMaker模块来编译并安装。当然,也有开发者使用其他方式例如辅助模块Module::Build,只需根据说明进行安装即可。使用cpan命令也可以方便的安装常用软件包。
⑵模块使用
use lib '模块路径';
BEGIN {
push @INC, '模块路径';
}
use File::Basename;
my $name = '/usr/local/bin/perl';
my $basename = basename $name; #返回'perl'给$basenam
use File::Basename qw/ basename /;
修改序列名称:
#!/perl -w
use warnings;
use strict;
open (FILE,"<$ARGV[0]") or die "can't open file $ARGV[0]";
open (OUT,">$ARGV[1]") or die "can't create file $ARGV[1]";
while(my $line = <FILE>){
$line =~ s/s+$//ig; #删除末尾空白字符
$line =~ s/@//; #删除“@”符号
$line =~ s/:/_/ig; #将“:”替换为“_”
my @list = split/s+/,$line; #使用空白符分割一行内容
print OUT "$list[0] $list[2] "; #只输出第一、三个字符
}
此脚本是将如下文件中序列名字进行修改,如下所示:
修改为:
程序只有一个输入文件和一个输出文件,通过替换操作来完成。
以上是关于Perl语言程序应用(资料汇总版)的主要内容,如果未能解决你的问题,请参考以下文章