前言
当你面对一堆数据心急如焚却无从下手的时候,是否希望立马出现一个编程牛人并以迅雷不及掩耳之势帮你获取想要的结果?可是往往牛人很忙,远水救不了近火。这时候是否恨不得自己瞬间变身为一名牛人?如果答案是肯定的,那么祝贺你,当你看到这篇文章时,就已经在变身牛人的路上了!
本课程(共八节课)主要是面向无Perl编程经验或者Perl语言初学者,介绍Perl的基本知识和常用编程技巧。我们的期望是:让读者通过八节课的学习,最终成为特工级的perl编程牛人。
(微信原文链接:请点击)
本节内容
本节课内容包括Perl 语言的基本介绍、基本数据结构以及变量常用的操作。
一、Perl语言基本介绍:
Perl(Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言")是一种功能丰富的计算机程序语言, 最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。现在的版本为Perl 6,于2015年12月25日更新。
Perl借取了C、sed、awk、shell 脚本语言以及很多其他程序语言的特性,因此Perl像C一样强大,像awk、sed等脚本描述语言一样方便。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。(此时笔者对Larry Wall的仰慕之情已如滔滔江水,连绵不绝,故奉上大神的皂片一张…)
fig1.png有学过其它编程语言(如C语言)的同学一定记得(记忆加载中…),入门第一个编程代码便是"Hello, World!"。下面我们将使用 Perl 输出"Hello, World!":
#!/usr/bin/perl
print "Hello, World!\n";
说明:
第1行:声明perl编译器的路径(一般情况下是/usr/bin/perl,依不同平台而异),通常表示方式为#!+ 解释器路径; 不要将#!与Perl代码的注释符号#相混淆;
第2行:使用print 函数输出字符串"Hello, World!\n"; 其中" \n"表示换行符.
Perl程序一般以" .pl"结尾,如hello.pl,将上述代码以文本形式保存到hello.pl,然后在Linux终端运行命令:
$ perl hello.pl
运行结果:Hello, World!
以上为脚本运行方式,也可以直接在Linux终端中使用 -e 选项输入语句来执行代码:
$ perl -e ' print "Hello World!\n" ' #输出:Hello World!
PS: 后面为了方便大家进行练习,所举例子以这种方式为主,大家有兴趣也可以改写成脚本形式后运行。
二、基本数据结构:
变量是存储在内存中的数据,Perl变量不需要显式声明类型,一般使用等号(=)来赋值。普通的变量名可以包含字母( a-z , A-Z)、数字(0-9)或类型标识符后面的一个下划线字符(_ ),变量名对大小写敏感,而且第一个字符不能是数字。Perl变量有三种基本数据结构:标量、数组、哈希。
1)标量
标量(scalar)是Perl语言中最简单的一种数据结构。这种数据结构的变量可以是数字,字符串,浮点数。在使用时在变量的名字前面加上一个美元符号"$",也称为魔符(sigil),表示是标量。例如:
$a=123; #数字123
$b="Hello"; #字符串"Hello"
$c=3.14; #浮点数3.14
小试牛刀:
$ perl -e ' \$a=123;print "$a\n" ' #输出:123
2)数组
列表(list)指的是标量的有序集合,而数组(array)则是储存列表的变量。数组变量以字符"@"开头,索引从0开始,例如:
@a=(1,2,3,4) #数组a包含4个数字
@b=("Bob","Tom","Fred") #数组b包含3个字
符串
$a[0] 表示数组a的第一个元素,值为1;
$b[1] 表示数组b的第二个元素,值为"Tom";
$b[2] (或$b[-1] )表示数组b的第三个(或倒数第一个)元素,值为"Fred";
小试牛刀:
perl -e ' @b=("Bob","Tom","Fred");print "$b[-1] \n" ' #输出:Fred
3)哈希
哈希(hash)是一个无序的 key/value (键/值)对集合。可以使用键作为下标获取值。哈希变量以字符"%"开头。例如:
%h=('a'=>1,'b'=>2); #哈希h包含2对键/值;
$h{'a'} 表示键'a'对应的值,大小为1;
小试牛刀:
perl -e ' %h=('a'=>1,'b'=>2);print "$h{'a'} \n" ' #输出:1
PS: 需要注意的是,有几个系统保留的变量名因为有其特殊的用途,不能被用来命名普通的变量,比如$1、$2、$3、…、$、$#、@、$!、$/等,这些特殊变量在后面的课程会逐一给大家介绍。
三、基本操作
Perl变量作为数据的存储单元,可以进行各种处理,比如标量的基本运算以及数组元素的操作等。标量基本运算操作主要包括:
1)算术运算符
我们设置变量 $a 为 10,$b 为 20,可以进行如下算术运算:
小试牛刀:
$ perl -e ' $a=10;$b=20;$c=$a+$b ;print "$c\n" ' #输出:30
2)赋值运算符
我们设置变量 $a 为 10,$b 为 20,可以进行如下赋值运算:
fig3.png
小试牛刀:
$ perl -e ' $a=10;$b=20;$b-=$a ; print "$b\n" ' #输出:10
3)比较运算符
我们设置变量 $a 为 10,$b 为 20,可以进行如下比较运算:
小试牛刀:
$ perl -e ' $a=10;$b=20; print "Hello,world!\n" if($a<=$b) ' #输出:Hello,world!
PS: cmd if(condition)是一个判断语句,表明“如果()中的condition为true就执行前面的cmd命令”,因为10<=20为true,所以会执行print命令,输出:Hello,world!
4)逻辑运算符
我们设置变量 $a 为 true, $b 为 false,进行如下逻辑运算:
小试牛刀:
$ perl -e ' $a="ture";$b="false"; print "Hello, everyone!\n" if($a || $b) ' #输出:Hello, everyone!
5)位运算
设置 $a =60,$b =13,进行如下位运算操作:
#60对应二进制为"00111100"
#13对应二进制为"00001101"
小试牛刀:
perl -e ' $a=60;$b=13; $c=$a & $b; print "$c\n" ' #输出:12
接下来我们介绍一下数组元素的操作,主要包括:
1)创建数组
数组变量一般可以通过列表进行赋值,可以将元素放在括号内,也可以用 qw 定义数组。例如:
@array = (1, 2, 'Hello');
@array = qw/这是 一个 数组/;
2)添加和删除数组元素
如果想对数组里面的元素进行添加或者删除,可以通过一些特定的函数来实现:
fig7.png
例如:
my @arr = (1,2,3,4);
my $first = shift @arr; # @arr: (2,3,4)
my $last = pop @arr; # @arr: (2,3)
unshift @arr, 1; # @arr: (1,2,3)
push @arr, (4,5); # @arr: (1,2,3,4,5)
print "@arr\n";
运行结果:1 2 3 4 5
3)切割数组
我们还可以对一个数组进行切割,并返回切割后的新数组:
@sites = qw/google taobao runoob weibo qq facebook/;
@sites2 = @sites[3,4,5];
print "@sites2\n";
运行结果:weibo qq facebook
4)split和join操作
split和join是常用的数组操作。Perl 语言中的split 函数可以将字符串转切割为数组,因此也被称为切割函数,例如:
$str = "A:B:C";
my @arr = split/:/,$str; #@arr = qw(A B C)
PS: 用split函数将字符串"A:B:C"以":"为分隔符进行切割,并赋值给数组@arr;
而join 函数功能则正好相反,它可以将数组连接成字符串,因此也被称为胶水函数,例如:
@arr = qw(A B C)
$str = join(",",@arr); # $str="A,B,C"
PS: 用join函数将数组qw(A B C) 以","为连接符进行粘连,并赋值给标量$str;
5)foreach和each操作
foreach函数可以遍历数组所有元素,例如:
foreach my $rock(qw(bedrock slate lava)){
print "One rock is $rock\.\n";
}
运行结果:
One rock is bedrock.
One rock is slate.
One rock is lava.
然而与foreach不同的是,each函数在每一次被调用时,会返回数组中下一个元素所对应的索引和元素的值,例如:
my @rocks= qw(bedrock slate lava);
while(my ($index,$value)=each @rocks) {
print "$index : $rocks[$index]\n";
}
运行结果:
0 : bedrock
1 : slate
2 : lava
PS: while(condition){cmd}是一个循环控制语句,表示“如果()中的condition为true就一直执行{}中的cmd命令”,each @rocks命令会依次获取@rocks中每个元素的索引和元素的值并分别赋值给(value)这两个变量,直到所有元素被遍历。
6)reverse和sort操作
reverse函数会读取列表的值并按相反的次序返回该列表,例如:
my @array = (1,2,3,4);
my @rev = reverse @array;
print join(",",@rev); #输出:4,3,2,1
sort函数则会对数组元素进行排序,例如:
my @array = (1,2,3,4);
@SORT = sort @array; #默认按字典顺序排序,
@SORT=qw(1 2 3 4)
@SORT = sort {$a <=> $b} @array; #按数字大小排序, @SORT=qw(1 2 3 4)
@SORT = sort {$b cmp $a} @array; #按字典**逆序**排序, @SORT=qw(4 3 2 1)
print "@SORT \n"; #输出:4 3 2 1
7)scalar函数
scalar 函数可以返回数组元素个数,例如:
my @arr = (1,2,3,4);
print scalar(@arr); # 输出:4
参考资料:
《Perl语言入门 第六版(中文版)》
http://www.runoob.com/perl/perl-tutorial.html
http://www.runoob.com/try/runcode.php?filename=HelloWorld&type=perl
小结
感谢大家的阅读,今天的课程主要给大家介绍了Perl 语言的基本知识、基本数据结构以及变量常用的操作,并配上简单的示例供大家练习巩固,希望对大家掌握Perl语言有所帮助。下一节课我们将学习:哈希和子函数,敬请大家关注!
网友评论