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 使用 open
、close
、opendir
、readdir
和 closedir
这些函数来访问 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_file
由 my
运算符声明,只在 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";
}