Perl教程 第二课

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语言入门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值