看到某公司笔试题上有个perl的编程的,就索性花两三天时间来学学perl,,知道这两三天不够的,先应付考试吧,呵呵。。。
1.Perl一般被称为“实用报表提取语言”(PracticalExtraction and Report Language),虽然有时被称做“病态折中垃圾列表器”
(Pathologically Eclectic Rubbish Lister)。它是术语,而不仅仅是简写,Perl的创造者,Larry Wall提出第一个,但很快又扩
展到第二个。那就是为什么“Perl”没有所有字母都大写。没必要争论那一个正确,Larry两个都认可。
Larry为什么发明perl:
Larry在80年代中期发明了Perl语言,当时他想从像新闻组邮件那样的文件中产生一些有用的报表给一个bug报告系统,
awk语言不能胜任这任务。Larry,作为一个懒惰的程序员◆,为了彻底的解决这个问题,决定发明一种一般用途的工具,
至少还能在一个不同的地方使用。这次努力的结果就是Perl V0。
2.Perl容易使用,但有些难学。
3 .perl的功能:
Perl被设计为:90%处理文本,10%针对其它情况。
4.第一个例子
#! /usr/bin/perl
print “Hello,word!\n”;
在Unix系统中,你需要用chmod命令将程序变成可执行的,可能像下面:
$ chmod a+x my_program
行首的美圆符号($)(和空格)是shell提示符,可能你的系统上有些不同。也可在chmod 后使用755来代替a+x 。两种
方法都是告诉系统这个文件是一个程序(可执行的)。
现在你可以如下运行它:
$ ./my_program(Unix系统这样运行,windows下用perl filename)
5.perl中的注释
在Perl中,注释由#开始,直到本行结束(Perl中没有“块
注释”(block comments))◆。
6.标量数据
在下面几段中,你将看到整数(如255,2001等)和浮点数(有小数点的实数,如3.14159,1.35x10
25),但在内部,Perl都把它们当作双精度浮点数来处理◆。这就是说在Perl内部没有整数值。程序中的整数被当做等价的浮点数来处理◆。你也许
注意不到这种转换(或者不关心),但你不应当寻找只属于整数的操作符(不能被浮点数使用的),因为它们不存在◆。
Perl允许用下划线来分隔整数,因此可以像下面这样书写:
61_298_040_283_768
八进制以0开头,十六进制以0x开头,二进制0b开头◆。在十
六进制中A到F(或者a到f)分别表示10到15:
对于Perl来讲,0xFF或255.00是没有区别的,
因此选择一种你和你的程序维护者(我们是指那个要读懂你代码的可怜伙计。通常,这个可怜的家伙就是你,你很可能想
不起3个月前,你为什么要那样做)认为最有意义的一种。
6.1perl数字操作符
Perl除了提供通常的操作符加(+),减(-),乘(*),除(/)等等之外:
2+3 #2+3,5
5.1-2.4 #5.1-2.4,2.7
3*12 #3*12,36
14/2 #14/2,7
10.2/0.3 #10.2/0.3,34
10/3 #通常是浮点除,3.33333… …
还提供了模数运算符(%)。10%3的值是10除以3的余数。两个操作数首先变成它们对应的整数值。另外,Perl中提供了和FORTRAN类似的指数操作符,C和Pascal很希望有类似的能力。这个操作符由
两个*号表示,如2**3,表示2的3次方,等于8◆。
6.2字符串
字符串是一串字符(如hello)。字符串可能是字符的任意组合◆。最短的字符串不含任何字符。最长的字符串,可以填满
整个内存。这符合Perl的哲学,只要有可能就不加任何内嵌的限制。通常字符串是可打印字符,数字,标点符号的序列(从
ASCII 32到ASCII 126)。但,Perl中字符串可以包含任意字符,意味着利用字符串(string)你可以创建,遍历,操作二进制
数据,而利用别的方法可能遇到极大的困难。例如,你可以把要更新的图片或编译好的程序放入一个Perl 的字符串变量中,
做完相应的修改后,再写回去。和C,C++不同,Perl中NUL字符没有特殊的含义。Perl能计算长度,不用靠null来判断字符串是否结束。
有两种类型的字符串:单引号字符串和双引号字符串。
单引号字符串是由单引号括起来的字符序列。单引号不是字符串的一部分,但Perl可以利用它来辨别字符串的开始和结束。
除了单引号,或者反斜线(包括换行字符,如果字符串在下一行继续)之外的任何字符都表示它自身。要得到一个反斜线,
可以把两个反斜线放在一起;要得到单引号,需要在单引号前加上反斜线:
单引号字符串中的\n不会被当作换行符来处理,其仅仅是两个字符\和n。只有在反斜线(\)后面接的是\或单引号’,其才会被
当作特殊符号来处理。
双引号字符串和在其它语言类似。它也是字符的序列,不同点在于,其由双引号括起来的。现在,反斜线可以用来表示控
制字符,或者八进制,十六进制数的表示。双引号中字符串“barney”和单引号字符串‘barney’ 相同。和数字一样,0377只是255.0的另一种写法。Perl允许你以一种更
有意义的方式来书写。当然,如果想\和之后的字符成为转义字符(如\n表示新行),应当使用双引号。
6.2.1字符串操作符
字符串可由. 操作符连接(是的,只是一个点) 。它不会改变任何字串,就像2+3不会改变2或3一样。串联之后的字符串
可供以后使用:
“hello”. “world” # 同于“helloworld”
“hello”. ‘’. “world”#同于“hello world”
‘hello world’. “\n” #同于“hello world\n”
一个特殊的操作符是字符串重复操作符(string repetition operator),由小写的字母x表示。这种操作能把操作符左边字符串
重复操作符右边数字那么多次:
“fred”x 3 # “fredfredfred”
“barney”x (4+1) # “barney”x 5, “barneybarneybarneybarneybarney”
5 x 4 #实际上是“5”x 4, “5555”
值得具体讲解下最后一个例子。字符串重复操作符需要一个字符串作为左操作数,因此数字5被转变为字符串“5”(在一
节将详细讨论),一个单字符字符串。这个新的字符串被复制4次,产生了一个4字符的字符串5555。如将两个操作数的
顺序对调下:4 x 5,将得到字符串44444。这表示字符串重复操作符不是可交换的。
复制次数(右操作数)在使用之前会把它转换为小于等于它的整数(如,4.8变为4)。重复次数小于1将产生空串(长度
为0)。
6.2.2数字和字符串之间的自动转换
大多数情况下,Perl 将在需要的时候自动在数字和字符串之间转换。它怎样知道什么时候需要字符串,什么时候需要数字
呢?这完全依赖于标量值之间的的操作符。如果操作符(如+)需要数字,Perl将把操作数当作数字看待。如果操作符需要
字符串(如. ),Perl将把操作数当作字符串看待。不必担心数字和字符串的区别;使用恰当的操作符,Perl将为你做剩下
的事。
当在需要数字的地方使用了字符串(如,乘法),Perl将自动把字符串转换为其等价的数字,就像输入的是十进制浮点数一
样◆。因此“12”*“3”将给出36。后面的非数字部分和前面的空格将被去掉,如“12fred34”* “3”将给出36而不会用任何
提示◆。在极端情形,当一个不含任何数字的字符串将别转换为0。如,将“fred”当作数字来使用时。
用首字符0表示非十进制值对数字有效,对自动转换没有作用。使用hex()和ort()来转换此类字符串。
6.3Perl内嵌的警告(warnings)
当程序中包含可能的错误时,可以要求Perl警告你。运行程序时,可以在命令行中使用–w这个参数把警告打开:
$ perl–w my_program
或者,如果一直都需要警告(warning),可以在#! 这一行加上-w,如:
#!/usr/bin/perl –w
在Perl5.6或之后的版本中,可以使用pragma来打开警告(warning).(注意,它对早期的Perl版本无效)◆。
#! /usr/bin/perl
use warnings;
现在,如果将‘12fred34’ 当作数字来用,Perl将警告你:
Argument “12fred34”isn’t numeric
当然,警告通常只对程序员有意义,对普通用户则没什么用处。如果程序员没有看到警告(没使用警告),这并没什么好处。
警告除了在某些时候抱怨可能出错外,不会改变程序的行为。如果看到不能理解的警告信息,可以使用diagnosticspragma,
通过它可以看到更详细的信息。perldiag的mangage中有对短的warning(警告)和长的diagnostic(诊断)的描述。
#! /usr/bin/perl
use diagnostics;
当把usediagnostics加入程序后,在每次调入程序时,它好象暂停了一会儿。那是因为Perl做了大量的工作(占去大块内
存),使在当Perl发现错误时,你能迅速的读其文档,如果有的话。这导致了一种对Perl程序优化的方法,当不需要读警
告信息相关的文档时,将use diagnostics去掉。(当然如果能修改程序,把引起警告的原因去掉,那是最好不过了。但只是
取消阅读这些文档已经足够。)
另一种优化方法是,在命令行中使用–M这个参数,仅当需要diagnostics时才用,而不用每次通过修改源代码来决定是否
激活diagnostics:
$ perl–Mdiagnostics ./my_program
Argument “12fred34”isn’t numeric in addition(+) at ./m_program line 17 (#1)
(W numeric) The indicated string was fed as an argument to
an operator thatexpected a numeric value instead. If you’re
fortunate the message will identify which operator was so unfortunate.
6.4标量变量
变量是保存一个或多个值的容器◆。变量的名字在整个程序中保持不变,但其包含的值可以变化。
标量变量可以存放一个标量值。标量变量的名字由一个美圆符号($)后接Perl标识符:由字母或下划线开头,后接字母,数字,或者下划线。或者说由字母,数字和下划线组成,但不能由数字开头。大小写是严格区分的:变量$Fred和变量$fred是不同的。
6.5print输出
当一个字符串由双引号括起来时,如果变量前没有反斜线,则变量会被其值内插◆。也就是说字符串中的标量变量◆将被
其值替换
$mean =“brontosaurus steak”;
$barney =“fred ate a $meal”; #$barney 现在是“fred ate a brontosaurus steak”
$barney =‘fred ate a’. $meal; #同上
如果一个变量未被赋值,则将使用空值替换:
◆这是一种特殊的未定义值,undef。在本章后面将介绍到。如果开启了警告,Perl将提示你内插的变量未定义(未初始化)。
$barney =“fred ate a $meat”; #$barney 现在是“fred atea ”;
如果使用的是单独一个变量,是否使用引号没有影响。如:
print“$fred”; #引号是没有必要的
print$fred; #更好的写法
在字符串中变量前($符号前)加上反斜线(\),变量将不会被内插(替换):
$fred =‘hello’;
print“The name is\$fred .\n”; #打印出美圆符号,变量不会被其值替换
print‘The name is $fred’. “\n”; #同上
变量名将是字符串中有意义的最长的那一个。这可能在当你需要在某次匹配就替换的情况下出问题。Perl 提供了一种类似
于shell的分隔符:花括号({})。用花括号将变量名括起来。或者将字符串分隔成几个部分,再用连接符(. )串起来:
$what =“brontosaurus steak”
$n = 3;
print“fred ate $n $whats.\n”; #不是steaks,而是$whats的值
print“fred ate $n ${what}s.\n”; #现在是使用变量$what
print“fred ate $n $what”. “s.\n”; #另一种方法
print‘fred ate ’. $n . ‘’. $what . “s.\n”; #一种复杂的方法
35!=30+5 #false
35==35.0 #true
‘35’eq‘35.0’ #false (按照字符串比较)
‘fred’lt ‘barney’ #false
‘fred’lt ‘free’ #true
‘fred’eq‘fred’ #true
‘fred’eq‘Fred’ #false
‘’gt ‘’ #true