在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Perl 是一门开源的脚本语言,由 Larry Wall 所创造,该语言以实用,快速开发为主要目标,与当前流行的面向对象结构化编程有些格格不入,但这并不妨碍 Perl 被广泛流传和使用,世界范围内围绕 Perl 建立起了非常活跃的社区,很多人在其中不断帮助完善文档,创建示例代码,提供一些第三库等等。具体可以浏览以下两个网页:www.cpan.org , www.perl.com. Perl 最出名也最擅长的要数文本处理了,很多其它语言要花几十上百行代码才能完成的任务,Perl 可能只需要几行代码就能完成。但这些优势是有代价的,Perl 书写代码的风格有时常常被诟病,典型的面向过程式语言,各种眼花缭乱令人头疼的符号,甚至 Perl 一直以来所坚持的哲学:只要不引起冲突误解,代码可以写成多种形式(There's More Than One Way To Do It)。这导致 Perl 在语法上具有非常松散随意的特点:同一件事情常常有多种不同的写法,有些看起来还很奇特,体现在语法上,Perl 的符号特别多,让 Perl 在一定程度比较难学易忘。 本文主要简单介绍一下 Perl 的基本语法,目的是通过本文,你能了解 Perl 基本的写法,能够顺利的去读别人的代码。天下的语言在一定程度上是相通的,如果有一门语言的基础,去学另一本语言,入门基本不会太难(函数式除外吧。。。),但要用到熟,用到得心应手,第三库的使用等,这些就需要耐心以及假以时日了。本节主要介绍一下各种数据类型. <一> 语句及注释: Perl 语句以分号(;)结尾,用 # 作为一行的注释,没有其它语言中那种跨行的注释。代码块用大括号围起来,这个和 C 类似,但这个大括号在有些地方是强制要求,如在 if ,for,do, while 等语句中,它不像其它语言一样会用缩进来判断块。 <二> 变量: 标量(scalar) & 列表(list) Perl把简单的数据类型,如字符串,数字等“单数”的东西统称为标量,与之相对的,就是“复数”的东西,如数组。标量的声明都是 $ 开始,如: $str = "abc"。多个标量也可以放一处一起声明: ($x, $y, $z) = (11, 22, "no", 4); 而数组的声明则是以@开头,如:@arr = ("abc","edf")。变量的声明和很多其它脚本语言一样,不需要指明类型,直接声明赋值就可以使用。如果只声明但不赋值,Perl 会默认给它赋值为:undef。 为了检查一个变量是否已被赋值,Perl 提供了一个操作符:defined,用于判断一个变量是否已经被赋值: if( !defined( $myvar ) ) { print "uninitialized variable"; } <三> 字符串 (1) 基本语法 在 Perl 中,所有字符串都是双引号或单引号括起来的,如: "string" 'string'。这两种方式在很多时候相同,不同的是当字符串出现其它变量或转义符号的时候,双引号会将变量的内容展开,而单引号的不会,这和 shell script 是相似的,如: $var = 234; $str1 = "str1:$var"; # 打印出来得到-> str1:234 $str2 = 'str2:$var'; # 打印出来得到-> str2:$var (2) 字符串拼接 点号(.)用于把字符串进行拼接,这个和其它一些语言直接把字符串连在一起就行不一样,要用点号把字符串连起来,如: $str = "abc"."efg"; # abcefg 很七,这个用法,和 shell script , vim script 也是一致的。 (3) 比较 这里需要强调的,字符串的比较要用:
而不要用== , >= , <= ,这些符号是用来比较数值类型的。 <四> 数组 (1) 声明 如前所说,数组是一个复数(plaural)形式的变量,它的声明是以@开头的,后面跟着小括号放入初始值: @arr = (12,34,56); 同一个数组里的元素类型不一定要一样,下面的写法也是合法的: @arr = (12,"abc",'c'); 当然,也可以声明空数组: @arr = (); 声明字符串数组时,可以用 q,qq,qw 系列操作符简化操作。q 代表 quoted, qw 代表: quoted word. @arr = qq(abc); # 等价于 ("abc") @arr = qw(abc ef gg); # 等价于("abc","ef","gg") @arr = q(abc); # 等价于('abc') 由上看出 qq 与 qw 的区别就在于,qq 是将括号中的整个内容当成一个整体加上双引号,而 qw 是以空格为分隔,如上第二个例子,abc, ef, gg 分别被加上了双引号,而 q 与 qq 相似。这几个操作符的好处在于,当你想在字符串加入转义符号,引号等符号时,会方便很多。 qq(\abc) eq “\\abc" qq("abc") eq ”\"abc\"" (2) 数组访问,插入 如果想访问数组里的元素,就用中括号加下标的方法,和很多其它语言一样,perl的数组元素从0开始算: print $arr[2]; 有人可能注意到了,引用里面元素的时候,又用了$,而不是@。这里其实有一个原则,用@时,是表示整个数组,而引用其中的元素时,就用 $,后面将讲到hash类型数组,也是同样的原则。上面是一次访问一个元素,如果需要取出 sub array(切片), 则应如下写: @sub_arr = @arr[1,4]; Perl 中的数组是没有指定大小的,如果访问了没有定义的元素,就会返回 undef: @arr = (1,2,3); $ele = $arr[20]; # ele == undef 如果要往数组中加入新元素,也可以直接用中括号+下标: $arr[4] = 4; #如果不存在第4个元素就插入,存在就覆盖。 (3) 转换 下面提一个很体现 Perl 风格的问题,前面说到,用@引用 一个数组时,表示对整个数组的引用,但这种引用在不同场合下(context)是表示不同含义的: @arr = ("abc", "ed"); print "arr: @arr" ; 上面的 print 会将 arr 中的元素一个个的提取出来展开打印,这个好理解,但如果我这样写呢: $sz = @arr; # 把数组赋值给一个标量,Perl 会把数组的大小赋值给左边的变量,所以上面的例子里,$sz 等于2。如果Perl没法判断,当前上下文是标量还是数组,默认情况下,@arr 都会展开数组: @arr2 = (1,2,@arr); # arr2 == (1,2,"abc","ed"). 但如果这时候,我是想让 @arr 当作标量来处理,怎么办?上面的写法是不行的。Perl 规定,如果想要指明转换为标量类型,就需要加上关键字: scalar. @arr2 = (1,2,scalar @arr); # arr2 == (1,2,2) (4) sort 排序功能 Perl 为数组提供了排序操作符:sort。默认情况下,sort 对数组里的元素按字母排序,然后返回一个新的数组,旧数组不变。 @arr = ("abc","rsz","ef"); @newarr = sort(@arr); # arr = abc rsz ef newarr = abc ef rsz. 如果数组里存的不是字符,或你不想按字符序排序, 可以指定按数字的方式排序。 sort ({$a <=> $b} @array) 大括号表示一个比较函数,<=> 是指数值比较,$a 和 $b 表示比较的两个数,这两个变量是语言预定义的变量不可以更改。如果把a,b的顺序调换一下,就表示反过来排序,如果用了数值排序,而数组中又有字符串元素,那字符串都被当作 0,如果有多个字符串,字符串之间仍按字母序来排序。如: @arr = (22,44,33,-12,gg ,hh) sort({$a<=>$b @arr); # 结果:-12 gg hh 22 33 44 (5) 插入,删除。 Perl 提供了 push, pop, shift, unshift 等函数对数组进行入栈出栈之类的操作。push 和 pop 作用在尾部,shift 与 unshift 作用在头部。 @arr = ("ab","bc","ee"); pop @arr; # 结果:("ab","bc") push(@arr,"hh"); #结果: ("ab","bc","hh") shift @arr; #结果: ("bc","hh") unshift(@arr, "vv"); #结果: ("vv","bc","hh") <五> hash 数组 (1) 声明与初化 Perl 里的 hash 数组类似于 python 里的 dict, c++ 中的 map。数组中保存的是 <key,value> 一对值。hash 数组用 % 来声明: %hash = ("key1","value1","key2","value2"); print "v1:$hash{key1}"; #打印出:value1. 上面的初始化语句在 key,value 很多时可读性很差,因此,Perl 又提供了另一种写法: %hash = ("key1"=>"value1","key2"=>"value2"); 其中符号 => 与逗号的效果是完全一样,但这种写法看起来,就比较容易分辨别哪个是 Key, 哪个是 value. (2) 插入,删除与修改 hash 的插入与修改在语法上是完全一样的。 $hash{"key"} = "value"; 如果 hash 数组中原来没有 “key”,就插入;如果有"key"及相应"value",如果原来有相应的 "key",就修改相应的 value 为新的 “value"。与此同时,Perl 提供了一个 delete 操作符来删除 hash 中的元素,如: delete $hash{"key"}; (3) 获取 key 与 value. Perl 提供了keys 和 values 这两个函数来获取 hash 中的全部 key,value。这两个操作符返回的是一个数组,如: %hash = ("k1"=>"v1","k2"=>"v2"); @k = keys (%hash); #k == ("k1","k2") @v = values(%hash); #v == ("v1","v2") 总结 本节主要介绍了 Perl 里一些常用的数据类型,由上可以看出 Perl 的语法是非常简洁直接的,但细节较多,上手并不难,但要用熟就要花些时间了。 |
请发表评论