Perl无废话入门指南


































































语法元素 C Perl Perl语法说明
注释 ```/* comments */``` ```# comments ``` 只支持单行注释
变量

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 = (1, 2, 3, 4, 5);
arr[0] = 0;  for my i (1..10) {
	arr[i] = i;  }  for my a (@arr) {
	print $a;
}
@arr[3..5] = (3..5);
	


数组声明以```@```标示
动态数组,不需要指定大小
数组下标从0开始
访问数组元素值的时候,要以$开头表示访问的是数值
[3..5]表示数组中下标为3到5之间的元素组成的数组
数组之间可以直接赋值
for循环内必须使用{}不可省略,即使只有一条语句
多维数组

int arr[10][10];
arr[0][1] = 9;
	

my @arr = (1, 2, 3);
arr[0] = [7, 8, 9];  print arr[0]->[1]; // 8
	

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; 
else 
    x = 1;
x > 0 ? x = 0 : x = 1;
	

if (x > 0) {      x = 0; 
} else { 
    x = 1;   }  x = 0 if x > 0;  x = 0 unless $x <= 0;
$x > 0 ? x = 0 : x = 1;
	

- 基本与C大同小异
- if 结构可以反转,意义不变,注意前句没有分号
- unless是if的反义词。顾名思义, unless是“除非”的意思。这里的四个表达方式是等价的
- 注意第一种方式中,条件部分的圆括号和语句部分的花括号是不可省略

循环语句

for (int i = 0; i < n; i++ )
while ( true ) { ... };
do { ... } while ( true );
	

for (@arry) { print _; }  for my key(@ary) { ... }
for my $count (1..10) { ... } 
while (true) { ... }
do { ... } while (true);
	

- for/while的语法都和C类似
- for关键字也可以用foreach,意义不变

函数

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是可选的,默认返回最后一个表达式的值

语法约束


- 编译时打开编译器所有的警告选项
- 使用lint工具

	

- ```perl –w myprogram.pl``` 打开运行警告开关,如果运行时Perl检查到了可能的错误,会显示警告信息,否则它默认是什么也不提示继续执行
- ```#!/usr/bin/perl –w``` 在代码文件第一行中加入-w选项开关
- ```use strict;``` 使用严格语法约束
- ```use warning;``` 启用警告

运行 编译后直接执行

- ```perl myprogram.pl```
- Unix下在代码第一行加入```#!/usr/bin/perl```,然后给文件加上可执行属性 ```chmod +x myprogram.pl```,之后就可以用```./myprogram.pl```命令来运行
- 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
{
// some code
}

在这个框架下面,你几乎可以容易就开始你的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;

// the others code
}

实际上,剩余的工作和以往的工作差不多了,编写一个一个的函数,并实现你的业务逻辑。对于你这样一个聪明的程序员来说,学会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.jinyu.liu@email.com', 'Cissy'=> 'cissy@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的官方站点](http://www.perl.org)
- [www.perl.com O’Reilly 维护的关于Perl的站点](http://www.perl.com)
- [www.cpan.org Perl的Module资源大全](http://www.cpan.org)
- [www.perlchina.com 中国Perl协会](http://www.perlchina.com)
- [www.pm.org 世界各地的Perl用户组织](http://www.pm.org)
- [www.perlmonks.org 用Perl写诗](http://www.perlmonks.org)
- http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/ IBM社区的Perl系列文章