说起编程语言,简单的来说无非就是这样几个必不可少的基本元素:变量、数据、表达式、流程控制语句(包括条件、分支、循环)、函数、对象。具体到语言上,大部分的内容只是表达的形式不同而已。而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 ”; 数据挖掘研究院 char* h2=”hello\n”; 数据挖掘实验室 | $h1=”hello ”; 数据挖掘研究院 $h2=’hello ’; 数据挖掘实验室 | 双引号解释内部的 ,而单引号则不解释 |
一维数组 | 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 ”); 数据挖掘研究院 } void (*hi)()=hello; 数据挖掘研究院 (*p)(); | sub hello{ print "Hello "; } 数据挖掘研究院 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表、队列、正则表达式、格式定义等等。

