目录
Larry 在20世纪80年代设计创建了 Perl,现在由 Perl5 Porters 团队维护 。Perl 语法简洁,适合处理与文字有关的任务。
CPAN 是一个存放用 Perl 编写的软件及其文档的网络存档,在全球有数百个镜像站点。
1. 数据结构
A variable is a name for a container that holds one or more values.
A scalar is a single thing.
A list is an ordered collection of scalars. An array is a variable that contains a list. Each element of an array or list is a separate scalar value, these are ordered and indexed by integers (0-based).
1.1 标量(scalar)
1) 值类型
- 数字
Perl 内部按照双精度浮点数来保存和运算数字。
书写方式 | 例子 |
---|---|
整数literal* | -10, 0, 10, 87654321(或87_654_321,只能用下划线分割) |
浮点数literal | -1.25, 255.00, 3.14e10, |
非十进制整数literal | binary: 0b1010; oct: 0377, 03_77; hex: 0xfff |
* A literal is how you represent a value in your source code.
- 字符串
字符串是一个字符的序列。字符通常由可输出的(ASCII码值32-126)字母、数字和标点符号组成。Perl 支持 Unicode 字符,但是需要手工加上use utf8;
指令。
书写方式 | 例子 |
---|---|
单引号字符串literal | ‘hello\n’,反斜线可以转义反斜线和单引号。 |
双引号字符串literal | “hello\n”, 反斜线可以转义多种控制字符。支持变量内插*。 |
* 变量内插:将双引号内 标量变量 替换成 标量变量值 。
- undef
首次赋值前,变量的初始值为 undef(未定义)值。defined()可用于判断值属于undef 还是空字符串。
2) 操作符
操作符 | 数值 | 字符串 |
---|---|---|
运算 | +, -, *, /, %, **, … | ., x, … |
相等 | == | eq |
不等 | != | ne |
大于 | > | gt |
小于 | < | lt |
大于等于 | >= | ge |
小于等于 | <= | le |
3) 标量变量
存储一个值(标量值)的变量称为标量变量。标量变量的名称一般为$[a-zA-Z_]\w+
,但在启用 utf8 编译指令后,标识符不局限于ACSII字符。标量变量常见的操作包括赋值(=)、二目赋值(+=, .=, …)等。
1.2 列表(list)和数组(array)
# acess, assign, literal
$a[0], $a[1], $a[2] = (1,2,3);
@b = (1..10); # 范围操作符
@words = qw(kitty mimmy geroge); # quoted word, delimeters: (), //, !!, ...
# 末尾:pop & push
pop @b; # return 10, @b is 1..9
push @b,9;
# 开头:shift & unshift
shift @words; # return kitty, @words id mimmy,geroge
unshift @words, 'kitty';
# 切片:splice
splice @b, 0, 3, qw(a b); # @ is (a,b,4,5,6,7,8,9,10)
# 目标数组,起始位置,长度(可选),替换列表(可选)
# reverse; sort
@rb = reverse @b; # not inplace
@wb = sort @words; # not inplace
# each return index and values
while (my($i,$v) = each @words) {
say "$i: $v";
}
1.3 哈希
与数组类似,哈希也是用于存放任意值的数据结构。但不同于数组以数字为索引,哈希使用名字(任意唯一的字符串,称为键)作为索引。
# 访问
$hash{$key}; # 访问哈希元素
%hash; # 访问整个哈希
# 赋值
## 列表
my %ha = (
beijing => 'China',
london => 'UK'
);
函数
keys
values
each
exists
delete
2. 控制结构
2.1 if 和 unless
$line = <STDIN>;
chomp($line);
if ($line eq "\n") {
print "A newline";
} else {
print $line;
}
2.2 while 和 until
# 初始化;
# while (测试) {
# }
$count = 0
while ($count < 10) {
$count += 2;
print;
}
2.3 for 和 foreach
Perl 通过圆括号里的分号(两个分号或者没有分号)判断控制结构是for循环还是foreach循环。
# for (初始化; 测试; 递增) {
# 程序主体;
# }
#
@b = (1..3);
print "Before foreach: @b\n";
# 控制变量$i是列表元素本身,而非复制品
# 循环结束后,$i是循环前的值(此例是undef)
# 如果不写控制变量,Perl使用默认变量$_
foreach $i (@b){
print "$i\n";
$i="m_$i";
print "$i\n";
}
print "After foreach: @b";
2.4 其它
为了简化代码书写,表达式后面可以接一个用于控制其行为的修饰符(表达式修饰符)。
my $positive_num = $n if $n > 0;
$n++ while $n < 10;
&f($_) foreach @arr;
条件操作符类似于if-then-else
结构。由于使用时需要三个操作数,因此也成为三目操作符。
# condition_expr ? if_true_expr : if_false_expr
my $size =
($width < 10) ? "small" :
($width < 20) ? "medium" :
($width < 50) ? "large" :
"huge";
逻辑操作符
#
2.5 循环控制
last
操作符能立即中止循环的执行。next
操作符会跳到当前循环块的底端(即结束当前这次迭代),继续执行下一次迭代。redo
能将控制返回到当前循环块的顶端,而不经过任何条件测试,也不会进入下一次循环迭代。
for (1..10) {
print "Round $_.\n";
print "Type: last, redo, next\n";
chomp(my $word = <STDIN>);
print "\n";
last if $word =~ /last/i;
next if $word =~ /next/i;
redo if $word =~ /redo/i;
print "***\n\n"
}
当需要从内层对外层循环块进行控制时,可以使用标签(label)。
LINE: while (<>) {
for (split) {
last LINE if /__END__/; # 跳出标签为LINE的循环
}
}
3. 子程序(用户自定义函数)
# 定义:sub,函数名,代码块
# 定长参数
# 私有变量
sub f1 {
my($a,$b)=@_; # 1.perl自动将参数列表转变为数组@_ # 2.使用my创建私有变量
if ($a>$b) {
$a;
} else {
$b;
}
}
&f1(10,12);
# 变长参数
sub f2 {
my($max_now) = shift @_;
foreach (@_) {
if ($_ > $max_now) {
$max_now = $_;
}
}
$max_now;
}
&f2(10,12,15,17);
# 任何perl子程序都有返回值,返回值默认是代码块中最后执行的表达式。也可以使用return指定。
4. 输入输出
输入
输出
文件句柄(filehandle)
# 裸字(bareword) # 裸字没有前置字符,建议使用全大写字母命名文件句柄
## 1. 默认句柄:STDIN, STDOUT, STDERR, 其余3个保留句柄名:DATA, ARGV, ARGVOUT
## 2. open & close
open HI, '<in_test'; # < 读取(默认模式)
open HO, '>out_test'; # > 创建、输出到新文件
open HOB, '>>log'; # >> 追加
### 三参数写法
open HI, '<:encoding(UTF-8)', 'in_test'; # 指定编码方式
open HO, '>:crlf', $filename; # DOS风格换行符 转换为 Unix风格
### close
close HI; # 重新打开文件句柄,或者程序结束时,perl会自动关闭文件句柄
# 标量变量
open my $t_fh, '<', 'test.txt'
or die "Could not open text.txt: $!"; # die; $!