Lists and Arrays
- pop和push
可以取出和添加数组末尾(索引值最大)的元素。取出后数组将不再含有该元素。 - shift和unshift
可以取出和添加数组开头的元素。 - foreach
foreach可以遍历列表中的值,依次迭代。控制变量并不是列表元素的复制值,而是列表元素本身,也就是说如果在循环中修改了控制变量的值,就会修改列表元素的值。
循环结束后,控制变量会变回循环开始之前的值,Perl会在foreach循环之前储存变量,完成后返回。(有点类似于中断)
@arrs = (1,3,5,9,10);
$val = 1000;
$num = 1;
foreach my $val (@arrs) {
print " " if ($num >0);
print "$val";
$num++;
}
以上循环先将@arrs里面的元素赋给$val,然后依次打印空格和当前元素, $num可以起到记录数组内元素个数的作用。
- reverse
读取列表值,并按相反的次序返回该列表。
eg:@arrays = reverse @arrays; - sort
读取列表值,并根据字符编码(ASCII)顺序对其进行排序。也可以自定规则,在后续章节有介绍。
但是在默认的sort中有时按照字符编码排序,例如在对数字排序时,10会排在7前面(1的ASCII码比7小)。
若需要按数字从小到大排序,可用以下命令:
@arrs = sort {$a <=> $b} @arrs;
Scalar and List Context
上下文
上下文指表达式所处的位置,Perl解析表达式的时候,希望得到的格式是什么,表达式的上下文就是什么。(可以理解为表达式所处的“环境”)
同一个表达式在不同的上下文当中有不同的含义。
例如将@arrays赋给一个数组,则可以得到一个数组,将@arrays赋给一个标量,则得到的是数组的元素个数。
- scalar函数
可以强制指定标量上下文。
子程序
-
定义
可以使用sub关键字定义子程序。子程序无需事先申明,任意位置定义,重名时,后面的定义会覆盖前面。
需要用与号(&)和程序名来调用子程序。
子程序内部通过数组变量@_来接受参数。 -
私有变量
默认情况下变量都是全局变量,用关键词my可以申明私有变量,私有变量的范围被圈定在当前语句块中。
子程序最后一次执行的结果会自动当成子程序返回值。
Hashes
哈希(Hashes)是一种数据结构,可以容纳很多值,随机存取。与数组的区别在于,哈希使用名字(唯一的字符串)进行索引。哈希的索引值称为键值(key),与此相对应的是值(value)。哈希中存储的是一系列的键/值对,可以看做简单的数据库。
- 哈希的申明和赋值
使用%进行申明,eg: my %tab; 列表可以对哈希进行赋值,但必须有偶数个成员(因为键/值一一对应)。另外哈希也可以赋值给列表,eg: my @arrays = %tab; 但不一定是按照原有的顺序存储在列表当中。
可以用=>将哈希赋值中的键/值区分开来,左边是键,右边是值。eg:“xiaoing” => 78
**use Data::Dumper; 表示使用Data模块中的Dumper函数
- 访问哈希元素
使用花括号指定索引:
eg: my $value = $scores{“xiaoming”}; 其中scores是哈希表的名字,"xiaoming"是键值。
单个哈希元素可以内插到双引号字符串,但是不支持整个哈希的内插。
关键词
Perl可以通过%ENV获取系统环境的配置信息。
- keys:返回哈希的键列表
my @names = keys %scores; - values:返回哈希的值列表
- each:用两个元素的列表形式返回键/值对
my ($name, $score) = each %scores; 每次返回一对键/值对,所有元素被访问过后,each会返回空列表。 - exists:检查哈希中是否存在指定的键,若存在返回1,不存在返回0。(可作为判断条件)
- delete:删除哈希中指定的键以及对应的值,同时删除一对键/值。
代码
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $tab = " "; #将空格键存进tab当中
my %scores = ( #建立哈希表scores
"ming" => 78,
"li" => 89,
"tang" => 89,
"song" => 90,
"wang" => 96,
"shi" => 84
);
print "\n Original score hash table content:\n";
print "-"x40 . "\n";
print Data:: Dumper -> Dump ([\%score],['scores']);
my $summary = " ";
$summary .= "following is the summary info:\n";
$summary .= "-"x50 . "\n"; #两行都有小数点,表示字符串的拼接
my $sum = 0;
while(my ($name, $score) = each %scores) {
$summary .= "${tab}${tab} $name ${tab} -- $score \n"; #此处以文本形式打印name和score,$tab用来分割
$sum +=$score; #sum用于计算总分
}
$summary .= "\n\n";
my @names = keys %scores;
my @scores = values %scores;
my $num = @names; #这一行的作用是将@names当中元素的个数赋给num
my $average = $sum/ $num; #算式可以得到平均成绩
print $summary;
my $person = "xiaoming";
if (exits $scores{$person}) {
print "we have obtained the score for $person\n";
}
注意对于哈希表scores用不同符号引用所代表的的含义
@scores代表整个哈希表
%scores代表要查找/使用其中的元素
$scores具体到其中的某一个值,例如上面一段代码中exists判断时,引用对应 $person的值。
答疑
Q:可以将文件导入到数组当中吗?
my @arrs = glob “$dir/*.log”; 可以将 $dir目录下所有log后缀名的文件名导入到数组当中。
Q:推荐教材?
A:Perl语言入门