Perl 学习手札(一)
时间:2007-12-27 来源:rac911
1 查询Perl版本
[oracle@crmdb eagle]$ perl -v
[oracle@crmdb eagle]$ perl -e 'print "hello world!\n"'
hello world!
2 第一支Perl程序
[oracle@crmdb eagle]$ more eagle
#!/usr/bin/perl
print "hello world!\n";
注意:
1>Perl的叙述句是用分号(;)隔开的,因此只要你的叙述句还没出现分号,Perl就不会把他当成一个完整的结束,除非你的这个叙述句是在一个区块的最后一句。我们可以在perldoc里面找到这样的范例;
2>Perl是以井字号(#)作为程式的注解标示,也就是只要以井字号开始,到叙述句结束前的内容都会被当成程式注解,Perl并不会尝试去执行他,或编译他。对于有些习惯于C程式写作的程式员而言,能够使用(/* .... */)来进行程式的注解确实是相当方便的。Perl并没有正式的定义方式来进行这样整个区块的注解,不过却可以利用其他方式来达到同样的目的。例如使用pod(plain-old documentation format,简明文件格式):
#!/usr/bin/perl
print "hello world\n";
=head1
这里其实是注解,所以也是很方便的
主要是可以一次放很多行注解
=cut
3 变量
1>数字1.2e3是表示1.2乘以10的三次方
#!/usr/local/bin/perl
$a = 0266;
$b = 0xff;
print "$a, $b\n";
printf "%lo, %lx\n", $a, $b;
我们可以看到结果就会像是:
182, 255
266, ff
printf 是以格式化的形式列印
2>在纯量的资料形态中,除了数字,另一个重要的部份则是字串。事实上,Perl的纯量值就不外乎这两种资料型态。在Perl中使用字串也非常的容易,你只需要在所要表达的字串前后加上一对的单引号或双引号就可以了
使用字串的时候,可以使用单引号和双引号(其中单引号会如实呈现其中内容,象\n或\t这样的字元不会得到翻译)
特殊字元介绍:
\n(换行字元),\t(跳格字元)
\a:会发出哔的警铃声
\d:代表一个数字的字元
\D:代表一个非数字的字元
\e:跳脱符号 (escape)
\f:换页
\n:换行
\s:一个空白字元 (包括空行,换页,跳格键也都属于空白字元)
\S:非空白字元
\t:跳格字元 (Tab)
\w:一个字母,包括了a-z,A-Z,底线跟数字
\W:非字母
调试方法:用warning函数来调试某个区块(象PL/SQL里面的exception)
[oracle@crmdb eagle]$ more eagle.pl
#!/usr/bin/perl
use warnings;
{
no warnings;
$foo = 3;
$f00 = 6;
}
print $foo;
3>运算
Perl会先乘号,除号进行运算,然后在把结果作相加或相减,但Perl里面并没有数学中的中括号或大括号,都是由小括号将他括起来
4>输入&输出
使用内建函数print;
4 阵列:阵列变数是以@符号开头
在定义了阵列@array之后,你可以指定阵列里面的值,就像这样的方式:
my @array;
$array[0] = 'first';
$array[1] = 'second';
$array[2] = 'third';
....
简单一点的方式来把阵列的值指定给你的阵列,就像这样:
my ($array[0], $array[1], $array[2]) = qw/first second third..../;
my @array = (1...10);
my @array = (0, 1, 2, 4...8, 10);
my @array2 = (3, -1, @array, 13);
my @array2 = qw/3, -1, @array, 13/; # 这应该不是你想要的东西
my @array = qw{first second third};
# 记得利用qq赋值给字串的作法吗?用qw赋值给阵列也是类似
$array[4] = 'fifth'; # 我们跳过索引值3
print $#array; # 这里取得的是最后一个索引值
print $array[3]; # 这里应该不会有任何结果
$#array是阵列中最后一个索引值,所以我们可以利用($#array + 1)得到目前阵列中的元素个数
阵列中加入新的值:
my @array = qw/first second third/;
$array[$#array+1] = 'forth'; # 把新的值放到现在最大索引值的下一个
阵列总结:
#!/usr/bin/perl
my @array = qw/first second third/; # 一开始,你还是有三个元素值
$array[$#array+1] = 'forth'; # 这时候的 $#array 其实是 2
$array[$#array+1] = 'fifth'; # 可是这时候 $#array 已经变成 3 了
print @array;
说明:阵列从0开始0,1,2,3...;其中$#array表示当前阵列的最大值,$#array+1表示当前阵列个数
$array[$#array+1]='forth表示给当前最大阵列赋值
1>push&pop:增加和取出阵列元素
my @array = qw{first second third};
push @array, 'fourth';
print $#array; # 这里印出来的是3,表示'fortuh'已经被放入阵列
pop @array;
print $#array; # 至于pop,则是把元素从阵列中取出
体现:“后进先出 (last in, first out)”
my @array = qw{first second third};
my @array2 = qw/fourth fifth/;
push @array, @array2;
print @array; # 现在你有五个元素了
2>shift/unshift
[oracle@crmdb eagle]$ more eagle.pl
#!/usr/bin/perl
my @array = (1...10);
shift @array; # 我把1拿掉了
unshift @array, 0; # 现在补上0
print @array; # 现在阵列的值变成了(0, 2...10)
[oracle@crmdb eagle]$ ./eagle.pl
0 2 3 4 5 6 7 8 9 10
例子:
#!/usr/bin/perl
my @array = (1...10); # 我们还是使用这个阵列
shift @array; # 我把1拿掉了
print "$_\t$array[$_]" for (0...9); # 现在阵列的值变成了(0, 2...10)
结果:
[oracle@crmdb eagle]$ ./eagle.pl
0 2
1 3
2 4
3 5
4 6
5 7
6 8
7 9
8 10
9
3>切片:从阵列中取出连续的数据
#!/usr/bin/perl
my @array = (0...10);
my @array2 = @array[2...4];
print @array2; # 没错,你拿到了(2, 3, 4) 三个元素
结果:
2 3 4
my @array = (0...10);
my @array2 = @array[2...4, 6];
这时候,你拿到的不但是(2, 3, 4)三个元素,也包含了6这一个元素
4>阵列运算
Sort:
my @array = qw/45 33 75 21 38 69 46/;
@array = sort { $a <=> $b } @array;
这样Perl就会帮我们把阵列重新排列成为
21 33 38 45 46 69 75
其实,如果你这样写也是有相同的效果:
@array = sort @array;
当然,如果你需要比较复杂的排序方式,就要把包含排序的区块加入,所以你也可以写成:
@array = sort { $b <=> $a } @array;
my @array = qw/-4 45 -33 8 75 21 -15 38 -69 46/;
@array = sort { ($a**2) <=> ($b**2) } @array; # 这次我们以平方进行排序
所以得到的结果会是:
-4 8 -15 21 -33 38 45 46 -69 75
Join:
print join ',', qw/-4 45 -33 8 75 21 -15 38 -69 46/;
这一行显然也可以写成:
my @array = qw/-4 45 -33 8 75 21 -15 38 -69 46/;
print join ',', @array;
和join函数相对应的的则是split,他可以帮忙你把一个字串进行分隔,并且放进阵列中
Map:
map就是把阵串列里的元素一一提出,并进行运算,然后得到另外一个串列,我们就把所得到的串列放到阵列中
Grep:
my @array = qw/6 -4 8 12 -22 19 -8 42/; # 指定一个串列给阵列 @array
my @positive = grep {$_ > 0} @array; # 把@array里大于零的数字取出
print "$_\n" for @positive; # 印出新的阵列 @positive
说明:$_是逐个去阵列里的每个数
5 控制结构
1>true/false判断
* 0 属于伪值
* 空字串属于伪值
* 如果一个字串的内容是"0",也会被视为伪值。
* 一个undef的值也属于伪值。
my $true = (1 < 2);
print $true;
没错,回传值是1,表示这是个真值,因此如果你在流程控制中用这样的判断式,很清楚可以知道流程的方向。
Perl里,变量的生成周期局限于其所属的区块中
简单的判断:
my $num = 3;
if ($num < 5) {
print "这是真的";
}
提示:
由于这些判断式会用到大量的二元运算符,为了避免执行上产生难以除错的问题,我们在这里提醒各位一些容
易忽略的部份。
"<",">",">=","<=","==","!=":这些算符都是在针对数字时用到的比较算符。
"eq","lt","gt","le","ge","ne":如果你是对字串进行比对,请记得使用这些比较算符。
2>unless
if叙述就是我们所说的“假如...就...”,而unless就变成了“除非...就...”。
3>else/elseif
if (($num != 1) && ($num != 2) && ($num != 3) && ...) { ... }
//
if ($date eq '星期一') {
....
} elsif ($date eq '星期二') {
....
} elsif ($date eq '星期三') {
....
....
} else {
print "你怎么会有$date\n";
}
4>while
my $num = 1;
my $result = 1; # 小心,这里一定要指定$result为1
while ($num <= 10) { # 确定你是否超过范围
$result*=$num;
$num = $num + 1;
}
5>until
my $num = 1;
my $result = 1;
until ($num > 10) {
$result*=$num;
$num = $num + 1;
}
6>for
my $result = 1;
for (my $num = 1; $num <= 10; $num = $num + 1) {
$result *= $num;
}
对for更简单的写法
for my $num (1...10) { # 这就是表示$num从1到10
print $num;
}
这其实可以写成:
for (1...10) { # $_ 经常被拿来作为回圈的预设变数
print $_;
}
更简化的写法:
print for (1...10);
Perl最常用到的预设变数$_,当我们在回圈中没有指定任何变数时,Perl就会把取出来的值放入预设变数$_中。紧接着我们希望把回圈取得的值列印出来,也就是执行 print $_;