Perl 基础

基本格式

Perl 在 Linux 中是内置程序,可以创建一个最简单的 hello.pl 来测试:

[root@server1 bin]$ vi hello.pl 
#! /usr/bin/perl -w

print "hello\n";
[root@server1 bin]$ chmod 755 hello.pl 
[root@server1 bin]$ ./hello.pl 
hello

第一行 #! 指定 Perl 程序所在位置。-w 开关告诉 Perl 解释器提供完整的警告消息的方法。最新版本中可以不使用 -w 开关。

变量

在 Perl 中使用变量之前不需要声明变量类型,所有标量型变量(Scalar Variable),也就是只包含一个元素的变量,都是以美元符号 $ 作为前缀:

$name = "Alice";
$age = 30;
$URL_ADDR = 'http://www.g.cn';

Perl 也允许定义多个元素的变量,使用符号 @ 作为前缀:

@authors = ("Alice","Bob","Cindy");
@list = (1,2,3,4);

数组元素也可以通过使用 $ 和元素的序号来解引用,从 0 开始计算:

@authors[1];

Perl 还允许声明关联数组(Associative Array)或以字符串作为索引的散列(Hash)。散列的索引称为键(Key),散列由百分号 % 特别指定:

%person = ( name => 'Alice', age => '30', url=> 'tty.org');

运算符

Perl 允许使用所有其他语言都有的同样的基本数学运算符:

#! /usr/bin/perl

$a=77;
$b=13;
$result=$a/$b;
print $result;
print "\n";

基本函数

Perl 提供的通用函数。

打印

函数 print 向标准输出或其他流输出一个字符串,它具有和其他很多语言一样的控制字符:

print "Hello again\n";

向一个具有文件句柄的文件打印文本:

print FILE "hello\n";

想在一个文本字符串中打印一个变量的值,可以使用点号(.)字符把变量内容加入到字符串语句中:

print "The result is:".$result."\n";

字符串操作

函数 chomp 用于删除变量末尾的多个换行符:

chomp @authors;

函数 join 把两个单独的字符串连接成一个字符串,类似 print 中点号的作用,但 join 可以单独指定两个字符串之间的分隔符。例如使用冒号作为连接字段的分隔符:

$fields = join ':' , $a1, $a2, $b;

函数 split 将根据指定的分隔符把一个字符串分割成一组字符串。例如将指定的字符串分割到两个单独的变量中:

($f1,$f2) = split /:/, 'Alice:Bob', 2;

或者不限制分割的段数,把分割结果存入到一个多元素的变量中:

(@fs) = split /:/, $raw_data;

split 函数还可以使用正则表达式进行模式匹配:

(@fs) = split /[^0-9]/, $raw_date;

文件操作

Perl 使用 opencloseopendirreaddirclosedir 这些函数来访问 Linux 系统上的底层文件系统。

函数 open 用来打开文件,然后就可以使用所获得的文件句柄处理文件内容,对文件进行读写操作:

#! /usr/bin/perl

open(FILE, "/etc/passwd");
@filedata=<FILE>;
close(FILE);

foreach $item (@filedata) {
        print $item ."\n";
}

opendir 用于打开目录并创建一个文件句柄,readdir 用于读取文件句柄,closedir 用于关闭文件句柄。

局部变量

my 运算符声明在一个有限范围(例如循环)内存在的变量。local 声明一个或多个已经存在的全局变量,这些变量拥有只在一个代码块中有效的值。

$name = Alice
foreach (@date) {
	my $current_file;
	local $name
}

首先在任何循环或子程序外定义的变量 $name 为全局声明,可以在后续代码块中的任意位置上使用。然后 $current_filemy 运算符声明,只在 foreach 循环中有效。最后是 local 运算符,它将变量限制到特定的代码块中,也就是修改一个已经存在的变量的作用域,待代码块执行结束,该变量将恢复成全局变量并继承全集变量的值。

循环和条件

while 循环示例如下:

while ($counter<10){
        print $counter."\n";
        $counter++;
}

do...while 循环会在第一次循环结束时检查测试条件,因此至少会执行循环体一次:

do {
        print $counter."\n";
        $counter++;
} while ($counter<10);

foreach 循环用于遍历数组,并把每个元素传递到一个临时变量中,直到打印完所有元素:

@list=(1,2,2,3);
foreach $tmp (@list) { print $tmp . "\n"; }

if...else 循环用于测试条件并有选择地执行:

$name='Bob';
if ($name eq 'Alice') {
print "Hey";
} elsif ($name eq 'Bob') {
print "Hi";
} else {
print "Hello";
}