热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl语言简介

http:www.chinaunix.net作者:urpos发表于:2003-05-0315:45:10Perl语言简介[转帖自Server&SHELL论坛ÿ

 


http://www.chinaunix.net 作者:urpos  发表于:2003-05-03 15:45:10

Perl语言简介  [转帖自Server & SHELL论坛:http://china.65535.net/phpBB204/phpBB2/index.php] [作者:briancai@urpos.com]  [版本:1.0]  [URL: http://www.urpos.com/perl.php]  [版权:本文可以任意转帖、引用。但必须包括作者、版本、URL和版权信息。欢迎提出建议,以便完善本文。 

什么是Perl?  Perl是一个能用来完成大量不同任务的编程语言。可以用来解开一个文件并打印一份报告,或者将一个文本文件转换成另一种格式。Perl为相当复杂的问题提供了一系列的工具,包括系统编程。  Perl写的程序叫脚本(Perl scripts),而perl程序(perl program)通常是指名字叫做perl的程序,它是用来执行脚本的。  Perl是解释型(不是编译型)语言。这样,运行一个脚本,和运行一个相应的C程序来讲,要花费相当多的CPU时间。但是,现在的计算机速度越来越快,写一个C程序花的时间比写一个Perl脚本多,从而总的来讲,反而节省了你的时间。

  Hello world!  我们还是来写一个Hello world脚本。通过它来介绍Perl脚本的编写和运行的一些最基本的东西。  现在开始: 

[Jobs /]cat >;hello 

#!/usr/bin/perl 

print "Hello world!/n"; 

[Jobs /]chmod a+x hello 

[Jobs /]./hello  Hello world! 

[Jobs /] 

注解: 

 1. cat命令创建一个叫hello的文件,它包含一个很简单的Perl脚本。通常可以用别的编辑器来创建脚本。 

2. 第一行脚本是, #!/usr/bin/perl。它表示脚本是由perl程序来运行的。它是一个必须的前缀。/usr/bin/perl部分是perl程序的路径名。不同的安装,路径名是不同的。 

3. 随后是相应的Perl脚本,这里仅有一行。这一行是很好理解的,其中/n代表newline(换行)。在Perl的字符串,控制字符通常使用这种与C语言类似的表达法,/后跟一个字符。 

 4. 程序写完之后,用chmod命令让这个包含脚本的程序可以执行。在Linux里,文件创建是通常是不可执行的,必须明确的改变文件的属性。在这个命令中all用户能execute(执行)这个文件。 

5. 最后,键入脚本文件名就能运行这个脚本了。 ./表示是在Jobs目录下的那个文件。  注意,在Perl中,和C语言一样,一个语句是一个分号结尾的。 

数据结构和变量 

Perl中一个变量的值可以是一个数字或字符串或其它别的东西。变量是没有类型的。你可以将一个字符串赋给一个变量,以后,你可以将一个数字赋给同一个变量。  变量在使用前不需要申明。  试图使用一个没有初始化的变量,你用的实际上是0或者一个空的字符串或真假值中的false(假),具体是哪个值,由上下文决定。在使用命令行开关时,表示要求Perl解释器能给出告警信息,

比如,-w报告使用了没有定义的值。 

Perl has three data structures:  Perl有三种数据结构:scalars,scalars数组,scalars联合数组,就是"hashes"  Scalar变量名通常以$符号开始,如$myvar  数组通常以@符号开始,如@myarray  Hashes的名字通常以%开始,如%myhash  另外,子程序的名字以&开始,通常这个&可以省略。  上面的符号可以和英语中的单词相对应:  $  the,  @  these or those,  %  these or those,  &  do  名字是区分字母的大小写的。比如$foo$Foo是两个不同的变量。  如果有个数组,如@myarr,你可以用方括号来索引它的某个成员。但此时@要变成$,如$myarr[5]。因为这个成员是一个scalar变量。  也可以组成一个数组,如@myvar[5..10],它是一个数组,是由@myvar组成的,它们的索引分别在510之间。 

数组的索引是整数,从0开始,和C语言一样。  Hashes,能用字符串来索引它的成员,因此,索引方法不同。对于hashes,索引用大括号表示,如$myhash{'foobar'}。同样,被索引的成员是scalar,必须用$开始。  每种变量都有他们自己的名字空间。因此$foo@foo是不同的变量名。同样$foo[1]@foo的一部分,而不是$foo的一部分。另外,有两个预定义的变量,$_@_。必须知道$_[2]@_中的一个成员。  一个数组事实上是一个值的列表。在Perl中,可以用以下方法来生成一个列表,  (2, 3, 7, 42)  一个列表可以赋给一个数组变量,如  @foo = (2, 3, 7, 42);  列表在Perl中是很重要的,因为许多操作的结果是列表。 

例子:显示的行带行号  下面的例子显示scalar变量的使用。同时也介绍了Perl的几个基本特征。  这个脚本打印出它的输入,但输出的每行有一个行号开始: 

#!/usr/bin/perl 

$line = 1; 

while (<>;) { 

print $line, " ", $_; 

$line &#61; $line &#43; 1; 

 Scalar变量$line是行记数。在一开始&#xff0c;它被初始化为1&#xff0c;在每次处理一行的循环中它的值加上一个1  循环结构的形式如下&#xff1a;  while (<>;) {  处理一行输入 }  尽管看上去有点神秘&#xff0c;它确实非常便于使用。你不必关心真正的输入操作&#xff1b;就用上面的结构就可以了&#xff0c;用预定义的变量$_来引用输入行。  print语句包含三个参数&#xff0c;一个是打印行号&#xff0c;一个是打印一个空格&#xff0c;另一个是打印整个的输入行。没有打印换行&#xff0c;因为变量$_中已经包含了换行符了。 

实际上&#xff0c;可以将代码写的更加简洁&#xff1a; 

#!/usr/bin/perl 

$line &#61; 1; 

while (<>;) { 

 print $line&#43;&#43;, " ", $_; 

这里&#xff0c;语句中包含了$line&#43;&#43; 而不仅仅是$line, 因为在Perl中&#xff0c;和C语言类似&#xff0c;你可以通过给变量加一个运算符来表示对一个变量加1操作。  如果希望行号是右对齐的&#xff0c;比如行号显示在固定的5个字符这样的区域内&#xff0c;左边的用空格来填充。

这相当简单&#xff0c;只需用下面这条语句代替print语句&#xff1a; 

printf "%5d %s", $line&#43;&#43;, $_; 

Perl脚本的输入  Perl脚本从那里得到输入值&#xff1f;默认的&#xff0c;即在输入没有任何参数的情况下&#xff0c;输入来自Linux中所谓的输入流。通常是用户的键盘。  通常希望脚本从文件中输入。简单的将文件名作为命令行参数&#xff0c;也就是&#xff0c;脚本文件的名字是命令的时候。

这样&#xff0c;举个例子&#xff0c;如果你已经写好了这个简单的脚本&#xff0c;并命名为lines&#xff0c;你可以用下面的方法来测试&#xff1a; 

&#xff3b;Jobs /&#xff3d;./lines lines 

1 #!/usr/bin/perl 

2 $line &#61; 1; 

3 while (<>;) { 

4 print $line&#43;&#43;, " ", $_; 

&#xff3b;Jobs /&#xff3d;  你可能写了几个文件名字作为命令行参数&#xff0c;比如&#xff1a;  lines foo bar zap  这意味着脚本lines将文件foo, bar,  zap 作为一个已经合并的单个文件来处理。 

例子&#xff1a;拆分输入行  Perl中&#xff0c;你可以不用详细地写代码就能将数据分成几个域。只需指定你想做什么。  比如&#xff0c;语句&#xff1a;  split;  首先将当前输入行分解成有空格分隔的域&#xff0c;然后将这些域分别赋值给预定义数组&#64;_。随后&#xff0c;就可以使用索引来存取这些域。变量$#_ 包含域的数目&#xff1a;它的值是域的数目减1

 假设&#xff0c;举个例子&#xff0c;有一些数据&#xff0c;每行包括几个由空格分隔的项&#xff0c;如果写一个Perl脚本&#xff0c;将每行的第二项挑选出来。可以写下面这样的一个脚本来实现。 

#!/usr/bin/perl 

while (<>;) { 

split;  print $_[1], "/n"; 

要注意的是由于在Perl中索引值从0开始&#xff0c;因此用一个值为1的索引是引用第二个域。 

控制结构  Perl有丰富的控制结构。理论上&#xff0c;通常也很实际&#xff0c;可以用if语句来实现分支结构&#xff0c;while语句来实现循环结构。  在控制结构中&#xff0c;实现有条件执行的动作&#xff0c;或循环执行的动作做为blocks。一个块是一个有大括号围起来的一系列语句。注意&#xff0c;括号是必须的&#xff0c;这和C语言略有不同。 

最简单的if语句的格式是&#xff1a; 

if(expression)block  它表示&#xff0c;先计算表达式的值&#xff0c;如果表达式的结果为真的话&#xff0c;就执行块语句。 

比如&#xff0c;语句if($i < 10) {$j &#61; 100;} &#xff0c;如果$i的值小于10的话&#xff0c;$j的值就设为100 

一个有两个分支的语句的格式如下&#xff1a;  if(expression)block1 else block2  首先计算表达式的值&#xff0c;如果为真&#xff0c;执行block1&#xff0c;否则执行block2   while语句的格式如下&#xff1a;  while(expression)block  先计算表达式的值&#xff0c;如果为真&#xff0c;执行块里面的语句&#xff0c;然后&#xff0c;再计算表达式的值&#xff0c;直到表达式的值为假&#xff0c;否则&#xff0c;还要执行块里的语句。 

下面的脚本是一个使用while语句的简单例子&#xff0c;它将输入行进行分解&#xff0c;按相反的方向把各个域打印出来。 

#!/usr/bin/perl 

while (<>;) { 

split;  $i &#61; $#_; 

while($i >;&#61; 0) { 

 print $_[$i--], " "; 

}  print "/n"; 

 }  在内部的while循环&#xff0c;控制是建立在使用一个辅助的变量$i上的。它的值初始化成对最后一个域的引用&#xff0c;并且不断递减&#xff0c;直到为0&#xff0c;此时&#xff0c;所有的域都处理完毕。运算符>;&#61;的意思是大于或等于。 

字符串处理  Perl有强大的字符串处理工具。比如&#xff0c;通常希望将输入数据转换成小写&#xff0c;很简单&#xff1a;  tr /A-Z/a-z/;  这可以理解成&#xff1a;将范围是AZ的所有字符转换&#xff08;translate&#xff09;成范围是az的字符。  这个操作是在变量$_上&#xff0c;也就是当前输入行上进行的。如果你想将它用到变量$foo上&#xff0c;你必须这样写&#xff1a;  $foo &#61;~ tr /A-Z/a-z/;  有可能这样的表达式很怪&#xff0c;但一旦熟悉之后&#xff0c;Perl的字符串工具很容易使用。 

例子&#xff1a;文件重命名  Linux用户需要将以后缀&#xff0c;比如.for结尾的文件的名字都重新命名成另一个后缀&#xff0c;比如.f。通常没有直接的命令来完成这一个任务。如果你想要用mv *.for *.f &#xff0c;通常这样并不能解决问题。 

但可以用Perl来写一个简单的脚本来实现&#xff1a; 

#!/usr/bin/perl 

while(<*.for>;) { 

$oldname &#61; $_; 

s//.for$//.f/; 

rename $oldname, $_; 

}  while语句表示它只对*.for的名字进行处理。首先将找到的要处理的文件名&#xff0c;把匹配的文件名赋给$_变量。  在循环体内&#xff0c;首先将$_变量所指的文件名保存到变量$oldname 里。随后&#xff0c;对它进行替换。  最后&#xff0c;用替换好的名字来重命名文件。renamePerl的一个内建函数&#xff0c;他有两个参数。我们可以用另一条语句来代替它&#xff1a;  system "mv $oldname $_";  它是通过调用操作系统命令来实现的。  另外&#xff0c;需要注意的是语句s//.for$//.f/;中的两个/。如果该语句中没有/&#xff0c;则成为&#xff1a;  s/.for$/.f/;  这个语句就不对了。如果遇到zapfor.for &#xff0c;就会产生如下替换&#xff1a;za.f.for。因为符号.代表任意字符。所以.for的意思是只要在字符串中包含for&#xff0c;就做替换。因此会产生上述结果。为了表示.&#xff0c;就必须用到换码序列&#xff0c;用/.来表示符号.。这与C语言中的概念类似。 

小结  Perl语言的语法和C语言有些相同之处&#xff0c;比如控制结构&#xff0c;语句的&#xff1b;结尾&#xff0c;换码序列等等。但它们也有明显差别。C语言是编译型的&#xff0c;C程序的运行效率高。Perl语言是解释型的&#xff0c;脚本的运行效率比较低。但是Perl语言的综合性较高&#xff0c;编写一些功能较复杂的程序所化的时间比较短。另外&#xff0c;Perl的变量是没有数据类型。 

参考资料  1MU Campus ComputingIntroduction to Perl or, Learn Perl in Two Hours   2The Perl Language Home Page 包括一些有关Perl的有用的信息&#xff0c;如Perl FAQ  3、在Windows 95NT上使用Perl语言。



推荐阅读
author-avatar
每天洗脸的小媳妇_853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有