Perl借取了C、sed、awk、shell脚本以及很多其他编程语言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。目前拉里·沃尔已经开发Perl 6,来作为Perl的后继;不过,Perl 6语言的语法有很多转变,所以Perl 6被视为Perl家族中的另一个语言。
Perl最初用于简单的文本处理(如log信息处理),现在被广泛的应用在系统管理、Web开发(PHP,CGI)、网络编程、GUI开发等。
因为许多Perl程序的代码难以阅读(write-only),加上它的面向对象功能被视为不是真正的面向对象(只是模块的模拟),于是很多人拿Perl和其他动态语言来比较。最常见的比较对象是Python。
Perl Package Manager四套开发工具程序,可以让你编写出适用于 unix, windows, linux系统的 CGI程序来。
选另外两个Windows版安装程序也OK。
[没有找到Perl格式的,用Python更好些]
#!/usr/bin/env perl
#
# 基本语法
# ;用于语句结束符
# #用于注释
# ""用于表示字符串,变量可以在""中被替换,如:
$var = "world.";
print "Hello $var\n"; #输出为:Hello world.
# ''用于表示字符串,''内的所有内容都被当作纯文本,如:
print 'Hello $var\n'; #输出为:Hello $var\n
# 关于style
print("Hello, world\n"); #OK
print "Hello, world\n"; #OK
# 变量类型
# Perl主要有三种变量类型: 标量、数组、哈希表
# Perl不需要预先声明变量,直接将变量值附给变量即可
# 标量表示单一值,以$后接变量名来表示一个标量
# 标量可以存储字符串、整数、浮点数
$var_scalar = 1;
print $var_scalar;
# 或者
print "The scalar's value is $var_scalar\n";
# 或者
print "The scalar's value is", $var_scalar, "\n";
# 用@后接变量名来表示一个数组
# 数组保存列表,列表是标量集合
@var_array = (1, 2, 3, "a", "b", "c");
# 或者
@var_array = qw(1 2 3 a b c);
# 或者
@var_array = qw/1 2 3 a b c/;
print "The 2nd elm of var_array is $var_array[1]\n";
# 数组切片
# 1. 输出数组中某两个值
print @var_array[0, 2], "\n";
# 2. 用连接符..输出数组中一个区间中的所有值
print @var_array[0..3], "\n";
# 用%后接变量名表示一个哈希,即"键值对"的集合
# => 符号左边是键,右边是值
%var_hashes = (a => "Apple", b => "Blizzard");
print "One elm of var_hashes is $var_hashes{\"b\"}\n";
# 用keys()或values()两个函数分别获取哈希表的所有键或所有值
my @allKeys = keys %var_hashes;
my @allValues = values %var_hashes;
# 常用内建变量
# $_ 默认变量
# @_ 默认数组变量,保存传递给子程序的所有参数
# $! 当前错误信息
# $0 当前脚本的文件名
# $$ 当前脚本的进程号
# @ARGV 命令行参数列表
# 内建操作符和操作函数
# +, -, *, /
# ==, !=, <, >, <=, >=
# eq equality
# ne inequality
# lt less than
# gt greater than
# le less than or equal
# ge greater than or equal
# &&, and
# ||, or
# !, not
# = 附值
# . 串连两个字符串
# x 重复字符串
# .. 以..符号相端点,创建一串值
# +=, -=, .=
print "Baidu"x3;
print "\n";
# 变量作用域
# 主要有my和local两种作用域
# my,声明的层次&同一层次
# local, 声明的层次&以内层次
my $var_my_scope;
local $var_local_scope;
# 不加my或local,默认为全局作用域
# !建议不要用过多全局的变量
# !建议在脚本开头加上如下两句:
use strict;
use warnings;
# 这样,解释器会强制你使用my或local来表示变量的作用域,
# 这样做可以帮你检查到一些普通的编程错误
# 条件判断和循环控制
# if, while, for, foreach,until, unless
# if
my $isOK = 1;
if ($isOK) { # ()和{}在这里都是必须使用的
print "OK\n";
} else {
print "Ooops...\n";
}
# 或者这样写:
print "OK\n" if $isOK;
# while
my $count = 10;
while($count > 0) {
print "while ... $count\n";
$count -= 1;
}
# 因为foreach的存在,for在Perl中用得很少,它的写法和C一样
my @array = (1, 2, 3, "a");
foreach my $elm (@array) {
print $elm, "\n";
}
# 文件操作,即IO
# open()函数打开一个文件
# 读文件$file,将文件的标识符附给$fileHandle
my $file2open="./1.txt";
my $fileHandle;
open($fileHandle, "<$file2open");
# <>符号用于读取$fileHandle指向的内容
# 利用钻石操作符号<>,你可以:
# 1. 将$fileHandle指向的内容附给一个标量,这样只读一行就over
# my $line = <$fileHandle>;
# 2. 将$fileHandle指向的内容附给一个数组,将每一行作为一个element
# my @lines = <$fileHandle>;
# 3. 常用于while或者foreach
foreach (<$fileHandle>) {
print $_;
}
# 写文件$file
open($fileHandle, ">$file2open");
print $fileHandle "abc";
# 追加写入
open($fileHandle, ">>$file2open");
print $fileHandle "def";
# 关闭文件
close($fileHandle);
# 子程序
# @_ 符号包含所有传递给子程序的参数
sub subFunc1 {
print "\nsubroutine 1\n";
}
sub subFunc2 {
print "subroutine 2\n";
return "I like Perl.\n";
}
sub subFunc3 {
my ($param1, $param2) = @_;
print $param1, $param2, "\n";
}
# calling subroutine
subFunc1();
# 或者
&subFunc1;
print subFunc2();
subFunc3("Ooops...", 123);
# 正则表达式
# 查找:在$re_test中查找oo
# =~是绑定操作符
my $re_test = "Google";
if($re_test =~ /oo/) {
print "Bingo!\n";
}
# 替换;在$re_test中用xx替换oo
if($re_test =~ s/oo/xx/){
print $re_test, "\n";
}
# 匹配修饰符
# i, g
my $re_test2 = "FacebOok";
if($re_test2 =~ /oo/i){
print "Bingo!\n";
}
获取Perl Module的地方主要有:
1. CPAN: Comprehensive Perl Archive Network(Perl综合典藏网)
2. 自己编写Perl模块
3. 随Perl发行版本一起打包的,安装在Perl/lib下
在脚本开头使用use 声明需要使用的模块,解释器看到后就会将模块中的代码加载进来,接着就可以使用模块中的子函数了。
可以通过perldoc这个命令来查看一些帮助信息 (p.s.:perl.org上有说perlfaq这个命令,但在我Windows版本的Perl64下没有找到)。
自己编写Perl模块话,参考一些现成的脚本来写是个不错的选择,刚才在网上看到markdown就是用perl写的:
完后,请立即找一份正二八紧的Perl编程书籍来瞧一瞧,之后就可以开始尝试写点东西了。