Perl直接入门详尽指南

来源:百度文库 编辑:神马文学网 时间:2024/04/19 20:29:21

 芝麻开门

  说起编程语言,简单的来说无非就是这样几个必不可少的基本元素:变量、数据、表达式、流程控制语句(包括条件、分支、循环)、函数、对象。具体到语言上,大部分的内容只是表达的形式不同而已。而Perl与C又有什么区别呢?

  首先要知道,Perl是一种脚本语言。所谓的脚本,就是没有主函数,从最开始一行一行的按照顺序解释执行(老版Basic不也是如此吗)。因此,尽管把你的思路转化为流程用Perl表达出来吧。

  其次,Perl的设计中参考了很多语言的长处,并避免了设计上的缺陷。因此Perl的很多语法你可能都会觉得似曾相识。我把Perl的语法总结了一下,和C语言做了一个简单的对比表格。表格左右两边的语句是C和Perl对应表达同一个功能各自的不同方式。如果读者有C语言的经验,相信看到这个对比可以很快的上手吧?

语法元素

C Perl

Perl语法说明

注释

/* … */

# …

只支持单行注释

变量

int a, b, c;

char c=’A’;

int x[10];

my ($a, $b, $c);

my $c='A';

my @x;

my %h;

声明使用my标示

表示值的变量以$开头,表示数组的变量以@开头,表示哈希表的变量以%开头。

声明可以省略(不建议)

字符串

char* h1=”hello\n”;

char* h2=”hello\\n”;

$h1=”hello\n”;

$h2=’hello\n’;

双引号解释内部的\n,而单引号则不解释

一维数组

int arr[10];

arr[0]=0;

for(i=0;i<10;i++)

arr[i]=i;

my @arr;

$arr[0]=0;

@arr[3..5]=(3..5);

数组声明以@标示

动态数组,不需要指定大小

数组下标从0开始

访问数组元素值的时候,要以$开头表示访问的是数值

[3..5]表示数组中下标为3到5之间的元素组成的数组

数组之间可以直接赋值

多维数组

int arr[10][10];

arr[0][1]=9;

my @arr;

$arr[0][1]=9;

Perl并不直接支持多维数组,而是以数组引用的方式间接支持。例如arr[0]的内容就是一个数组的引用地址。

指针

char c;

int* x=&c;

c='a';

printf(*x);

my $c;

my $x=\$c;

$c='a';

print $x;

\和C中的&类似,意思是取引用

 

void hello() {

  printf(“Hello\n”);

}

void (*hi)()=hello;

(*p)();

sub hello{

       print "Hello\n";

}

my $hi = *hello;

&$hi;

&表示调用函数

*取函数的代码地址

不必用括号把参数括起来

调用时的括号也是可选的

条件语句

if (x>0) x=0;

x>0 ? x=0 : ;

if ($x>0) { $x=0; }

$x=0 if $x>0;

$x=0 unless $x<=0;

$x>0 ? $x=0 : ;

if 结构可以反转,意义不变,注意前句没有分号。

顾名思义, unless是“除非”的意思。这里的四个表达方式是等价的。注意第一种方式中,条件部分的圆括号和语句部分的花括号是不可省略的。

循环语句

foreach (@arry)

foreach my $key(@ary)

foreach $count (1..10)

for/while的语法都和C类似。

foreach关键字也可以用for,意义不变。

函数

int max(int x, int y)

{

  return x>y?x:y;

}

 

int n=max(1,2);

sub max

{

       my ($x, $y)=@_;

       return $x>$y?$x:$y;

}

my $n=max(1,2)

注意下划线”_”也是一个合法的变量名。而@_是Perl内置的一个数组,内容为函数的参数。

my ($x, $y) 表示声明了一个有两个元素的数组,并将两个元素映射到$x和$y上。

($x,$y)=@_;则表示两个数组之间的复制,@_中对应的元素的值就赋值给了$x和$y.这是一个简便的写法,也可以这样写

my $x=$_[0]; my $y=$_[1];

return是可选的,默认返回最后一个表达式的值

语法约束

1.       编译时打开编译器所有的警告选项

2.       使用lint工具

 

3.       perl –w myprogram.pl 打开运行警告开关,如果运行时Perl检查到了可能的错误,会显示警告信息,否则它默认是什么也不提示继续执行。

4.       #!/usr/bin/perl –w 在代码文件第一行中加入-w选项开关

5.       use strict; 使用严格语法约束

运行

编译后直接执行

 

1.       perl myprogram.pl 手工执行

2.       #!/usr/bin/perl

Unix下在代码第一行加入,然后给文件加上可执行的属性 chmod +x myprogram.pl,之后就可以用./myprogram.pl命令来运行。

3.       Windows下,安装ActivePerl的时候,已经将.pl后缀的文件和perl的解释程序关联起来了,因此直接双击文件图标就可以运行。

  需要说明的是,在Perl的世界中有一句名言“条条大路通罗马”, 这句话的意思是说同样一件事情Perl允许你用很多种不同的方式去做。因此上表的例子风格是按照C的习惯来写的,并且为了简化起见,只是挑选了与C相似的内容。事实上,Perl包含了很多C没有的东西,例如内置的Hash表、队列、正则表达式、格式定义等等。

从框架开始
  Perl有很多表达方式,我们可以选择一种自己熟悉、容易理解的方式来写Perl的程序。例如,你是一个经验丰富的C程序员,那么你可以选择以C的风格来写Perl程序。下面是一个小小的样板框架


#!/usr/bin/perl -w

use strict;


# 程序开始的第一行语句,调用main函数

main();


# 定义main函数

sub main

{

}

  在这个框架下面,你几乎可以容易就开始你的Perl开发了。如果需要处理命令行参数,就可以稍微的扩展一下这个框架。
#!/usr/bin/perl -w

use strict;

use Getopt::Std;

main();


my $configfile;


sub ProcessOptions

{

my $VERSION = '1.0.0';

my $USAGE = "pp.pl [-v | -c configfile]\n";

my $opts={};

 

die $USAGE unless( getopts("c:v", $opts) );

die $VERSION if ($opts->{'v'});

$configfile=$opts->{'c'} ? $opts->{'c'} : 'config.xml' ;

}


sub main

{

ProcessOptions();

print $configfile;

}

  实际上,剩余的工作和以往的工作差不多了,编写一个一个的函数,并实现你的业务逻辑。对于你这样一个聪明的程序员来说,学会Perl是一个很容易的事情。

常见问题
  以我的学习经验来看,在开发的过程中可能有一些常用但是很分散的细节问题会让你感到困惑。

  1、 程序的入口参数怎么取?

  内置数组@ARGV包含了所有的运行参数。可以打印出来看看 print @ARGV;

  2、 函数如何传参数、取参数?

  每个函数内部都有一个内置的数组 @_ ,这个数组的元素就是函数的参数。例如传入的第一个参数就是$_[0],第二个是$_[1]。唔,如你所见,Perl的函数参数就是C中的动态参数。

  3、 默认变量是什么

  这个可能会把你的头搞晕。有一个内置变量 $_ ,

  4、 显示消息、退出常见的简单写法
  die ‘Error on program’;

  也可以在条件不满足的情况下使用
  die ‘Configuration error’ unless($doc->getDocumentElement);

  5、 格式化输出

  可以用简单的print语句进行一般的输出操作,如果需要复杂的格式化输出,可以使用printf语句……跟C的用法几乎是一样的。
  printf("pi=%.6f", 355/113);

  6、 =>是什么东西?

  在使用Hash表的时候,可以经常看到=>这个符号。例如这样的一个定义:
  my $account={

  'Simon'=> 'simon@email.com',

  'Jesse'=> 'jesse@email.com'

  };

  其实,=>符号跟逗号”,”是等价的。Perl里面的Hash表事实上是一个数组,只是把奇数位元素看做是Key(键),而把偶数位的元素看做是Value(值)。

  7、 关于引用的一点说明

  Perl的引用类似C的指针,所谓的引用事实上就是地址。取一个变量的地址用反斜杠”\”操作符,例如 $p=\$x; 那么$p就是一个指向$x变量的指针。要引用指针的值,使用”$”操作符,例如 print $$p; 就是打印$x的值。

  引用不单单可以引用变量,也可以引用数组、HASH表、函数,取函数的地址可以使用*操作符。

还能做什么
  Perl作为一个功能强大的脚本语言,可以应用在Web 编程、数据库、XML、系统管理、图形图像、自然语言、压缩、加密、邮件系统、软件测试等各个地方。在CPAN上,你可以找到各种各样你所需要的模块支持。例如,你可以:

  编写系统管理的脚本

  和Apache结合起来,编写CGI程序

  编写动态网页

  使用Net命名空间下的类编写网络应用程序

  使用Authen::Captcha模块实现提交时的验证码的功能

  使用Storable模块处理Perl的各种数据结构

  使用GD/Image::MagicK模块处理图形

  等等…

资源
  www.perl.org Perl的官方站点

  www.perl.com O’Reily 维护的关于Perl的站点

  www.cpan.org Perl的Module资源大全

  www.perlchina.com 中国Perl协会

  www.pm.org 世界各地的Perl用户组织

  www.perlmonks.org 用Perl写诗 J

  http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/ IBM社区的Perl系列文章