perl入门
2015-10-24 09:49
211 查看
转载于此
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的写法,能够顺利的去读别人的代码。天下的语言在一定程度上是相通的,如果有一门语言的基础,去学另一本语言,入门基本不会太难,但要用到熟,得心应手,第三库的使用等,这些就需要耐心,假以时日了。
本节主要介绍一下各种数据类型.
(一)语句及注释:
(二) 变量: 标量(scalar) & 列表(list)
(三) 字符串
(1)基本语法
(2)拼接
点号(.)用于把字符串进行拼接,这个和其它一些语言直接把字符串连在一起就行不一样。
要用点号把字符串连起来,如:
$str = “abc”.”efg”; # abcefg
这个用法,和shell script , vim script是一致的。
(3)比较
(四) 数组
(五) hash 数组
(六) if / else
(七) 循环: for / while / foreach
(八) I/O
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的变量声明和很多其它脚本语言一样,不需要指明类型,直接声明赋值就可以使用。 如果只声明但不赋值,Per会l默认给它赋值为: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)比较
这里需要强调的,字符串的比较要用: lt 小于 gt 大于 eq 等于 而不要用== , >= , <= ,这些符号是用来比较数值类型的。
(四) 数组
(1)声明 如前所说,数组是一个复数(plaural)形式的变量,它的声明是以@开头的,后面跟着小括号放入初始值。 @arr = (12,34,56); 同一个数组里的元素类型不一定要一样,下面的写法也是合法的: @arr = (12,"abc",'c'); 也可以声明空数组: @arr = (); 声明字符串数组时,可以用q,qq,qw系列操作符简化操作。q代表quoted, qw代表: quotedword. @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")
(六) if / else
Perl中的if/else语法上和c语言一致,除了要求一定要有大括号。 逻辑判断操作: 与(&&), 或(||),非(!) 语法上也很和C是一致的。 $str = "abc"; @arr = (2,3,4); if( $str && @arr == 3) { } else { } 上面的例子是一种比较传统老式的写法,前面我说if / else 和C中的语法一致,其实也不大准确。 Perl自己还提供了一套与C不大一样的写法,风格上更像是自然语言一样。 $var = 2; Print " hello world" if ($var > 0); #注意这行,等价于: if ($var > 0) { print "hello world";} 这种写法就像是自然语言里的倒序了。 像上面这种写法,还有另外一个关键字也是同样适用的: unless Print " hello world" unless ($var > 0);
(七) 循环: for / while / foreach
for ($i=0; $i<100; $i++) { print "hello $i \n"; } while( $i < 100 ) { print "hello $i \n"; $i++; } 上面两字例子演示了 for / while的写法,可见是和C 在语法上是一样的。 除了for / while ,Perl还提供了一个 foreach 专门用来处理数组。 @arr = (1,2,3,4,5); foreach $item (@arr) { print "item: $item\n"; } 注意foreach 那一行中的小括号是不能省的。
(八) I/O
Perl中进行I/O操作延用了unix中的IO概念,一切都抽象成文件。 所以,I/O操作都是对一个文件句柄(file handle)进行操作,包括标准输入标准输出。 (1) 标准输入,标准输出。 前面示例代码中多次用到了print,在之前的写法这是标准输出,但它的功能却不仅限于标准输出,事实上它的准确原型是: print <file handle> "hello world\n"; 如果省略了 file handle,默认情况下就是标准输出,标准输出的句柄 <STDOUT> 所以前面的print语句,事实上等价于: print STDOUT "hello world\n"; 对应的标准输入是STDIN, 这个两个变量是Perl预定义的。 可以看成是一个关键字一样,也不需要在这些变量前面加$,@这类的符号 。 前面一直只示例了标准输出,没有提过标准输入。 标准输入语法上,也很简洁: $line = <STDIN>; #read 用尖括号把文件句柄括起来,就相当于从里面读数据。 (2) 文件I/O 获取及关闭文件要用Open()/Close()函数。 $succ= open(fh,“~/myfile.log”); if($succ) { $line = <fh>;#read one line. @all = <fh>; #read the whole file. print "@line \n"; close(fh); } 值得注意的是,文件句柄的声明是可以不用加$这种符号,直接写一个名字就够了,当然,你如果喜欢加上$,也是没问题的。 前面的示例演示了读入时的最基本的做法,Perl还提供了和C语言里类似的文件操作函数:seek, tell, 用来定位到文件的相应位置进行读写。 它们的用法和c语言很相似,具体使用方式,有兴趣的读者可以自己去查阅一下官方文档。 前面的open()函数示例了文件打开的最基本形式,事实上,这个函数l还支持设置访问模式。 文件访问模式: 访问模式例子说明 读(Read) open(FH,"< FileName"); 从文件中读取 写(Write) open(FH,"> FileName"); 向文件中写入,覆盖旧文件中的内容 追加(Append) open(FH,">> FileName");向现有文件的尾部追加数据 读写(Read and Write) open(FH,"+< FileName");读取和写入现有文件 写入程序 open(PIPEOUT,"| pipeout"); 打开程序管道 读取程序 open(PIPEIN,"pipein |"); 从程序或命令的输出中取得数据 如果打开的文件支持写操作,我们就可以用Print 函数往文件里写东西: if(open(fh,">~/file.log")) { print fh "hello file\n"; close(fh); }
相关文章推荐
- Perl模块编写说明
- perl如何避免脚本在windows中闪一下就关闭
- Perl中的特殊内置变量详细介绍
- linux下使用perl获取本机ip的几种方法介绍
- Lua脚本语言入门笔记
- Lua脚本语言基本语法快速入门教程
- Lua脚本语言概述
- perl 控制结构 条件控制 if while
- Perl中的列表和数组学习笔记
- perl数据库添加、删除、更新、查询操作例子
- perl操作MongoDB报错undefined symbol: HeUTF8解决方法
- Perl中使用MIME::Lite发送邮件实例
- 什么是Perl?编程语言Perl详细介绍
- About Perl(翻译Perl官网介绍)
- perl 基本语法介绍
- perl 模式匹配参数详解
- PERL脚本 学习笔记
- perl 列表和数组变量详解
- 探索Perl的世界(更新到40集)-Perl视频教程
- perl 文件读写详细说明