perl编程入门学习笔记《Learning Perl》学习笔记

发布时间:2020-03-08编辑:脚本学堂
本文详细介绍了,有关《perl编程入门》这本书的学习笔记,如果你参照本文的提纲性笔记去学习《Learning Perl》,相信会进步很快的,有兴趣吗?快来看看吧。

3.1 Perl的缺省变量$_

在任何需要使用标量变量的地方,都可以省略不写,而Perl会自动使用缺省变量$_表示这个变量。
譬如:
 

复制代码 代码示例:
foreach (1..10) { #缺省使用$_
print "I can count to $_!n";
}

第四章 子例程
本章讲述了子例程(subroutine)的概念,介绍了子例程的定义、调用格式、参数、返回值等。

1.子例程的概念
子例程和其它编程语言中函数的概念类似,唯一的区别是Perl中的子例程总是用户定义的,而函数可能包括系统自带的内置函数。
和标量、数组类似,子例程也有单独的命名空间,该命名空间以与字符("&")标识。

2.定义及调用格式

用关键字sub和子例程的名字定义一个子例程,如下所示:
 

复制代码 代码示例:
sub max {
...
}
 

调用时,去掉sub,在子例程名字前面加"&",如下所示:
 

复制代码 代码示例:
$max_num = &max($a, $b);

3. 参数和返回值
传递给子例程的参数,会自动保存在子例程内的一个默认变量@_中.

这是一个数组变量,
对其中的元素进行访问的方式为$_[i], i=0,1,...

譬如:
 

复制代码 代码示例:
sub max {
if ($_[0] > $_[1]) {
$_[0];
} else {
$_[1];
}
}

默认情况下,在子例程中得到的最后一个计算值自动成为返回值,即不需要明确的return语句。
当然,使用return语句可以立即从子例程中返回一个值,并不再执行子例程的其余部分。

4. 私有变量及严格的编码规范
使用my关键字定义的变量为私有变量,其作用范围为最小的代码块。

用法如下:
my $a; #定义了一个私有标量
my ($a, $b); #定义了一个私有列表

为了告诉Perl执行严格的语法规则检查,可以把use strict pragma放在程序顶部(或在任何你希望强制使用这些规则的块或文件中)
use strict; #强制使用一些好的编程规则

5.其它
忘记local,我们用不到这个东西:P
在调用子例程时,总是使用与字符(&),这是安全和保险的。

第五章 散列

本章讲述了散列(hash)的概念、访问方法及针对散列的一些函数

1.散列的概念
散列类似于数组,与数组相同的是它可以含有任意数目的值并随意读取它们;
与数组不同的是,在散列中,使用的索引是字符串(这里成为键(key))而不是数值,
即使用名字来查找对应的值。键是任意字符串,在某个确定的散列中,它的值是唯一的。

键和值(value)都是任意的标量,但键总是被转成字符串。

2.访问方法

和标量、数组一样,散列拥有独立的命名空间。
访问散列中的元素,可以使用如下的语法:
$hash{$some_key}

访问整个散列,使用百分号(%)做前缀
%hash

3.赋值

为了方便起见,可以将散列转换为一个列表,并转换回来。给散列赋值是一个列表上下文,这个表由键-值对组成:
 

复制代码 代码示例:
%some_hash={"foo",35,"bar",12.4,2.5,"hello","wilma",1.72e30,"betty","byen");

在这种赋值中,不太容易分辨键和值的对应关系,在Perl中,可以使用大箭头(=>)来表示键和值的对应关系,如下所示:
 

复制代码 代码示例:
%some_hash={
"foo" => 35,
"bar" => 12.4,
2.5 => "hello",
"wilma" => 1.72e30,
"betty" => "byen",
);
 

散列(在列表上下文中)的值是一个简单的键-值对列表:
@any_array = %some_hash;
上式称之为展开(unwind)散列,展开时不能预知键-值对的顺序,但是键和值总是对应的。

4.散列函数
4.1 keys和values函数
my @k = keys %hash; # 获得该散列中所有的键
my @v = values %hash; #获得该散列中所有的数值

在一个标量上下文中,这些函数给出散列中的元素(键-值对)个数
 

复制代码 代码示例:
my $count = keys %hash;

4.2 each函数
each函数用于遍历一个散列,每次返回一个键-值对作为一个二元素列表。

实际情况下,一般只在while循环中使用each,如下所示:
 

复制代码 代码示例:
while ( ($key,$value) = each %hash) {
print "$key => $valuen";
}
 

以上示例用于遍历散列%hash,每次取一个键-值对,并将该键-值对赋给($key,$value)列表。
当遍历完该散列时,($key,$value)=(undef,undef),
此时,while循环条件不成立,则循环结束。

为了遍历散列,也可以使用foreach和keys函数相结合的方式,采用这种方式,还可以在遍历时对散列进行排序,如下所示:
 

复制代码 代码示例:
foreach $key (sort keys %hash) {
...
}

4.3 exists函数
要查看某键是否在散列中,可以使用exists函数,它在键存在时返回真,不论相应的值是真还是假:
 

复制代码 代码示例:
if (exists $books{"dino"}) {
...
}

4.4 delete函数
delete函数从散列中删去指定的键(和相应的值)。(如无此键,它的任务就结束了。此时既无警告,也没有错误消息。)
 

复制代码 代码示例:
my $person = "betty";
delete $books{$person}; #撤销$person的借书卡

4.5 reverse操作符
使用reverse操作符可以生成一个逆散列,即原先的键变为新散列中的值,原先的值变成新散列中的键。
如果原散列中的值不是唯一的(即值之间有重复),则无法判断新的散列中某个键对应的是哪个值。
因此,使用reverse操作符变换散列一般只适用于键和值都是唯一(不重复)的散列。

第六章 I/O基础

本章主要讲述了如何从标准输入/文件中获得输入及如何向标准输出进行输出。

1.从标准输入进行输入
使用行输入操作符<STDIN>从标准输入中获得输入。
$line = <STDIN>; # 读入一行

在循环中使用:
 

复制代码 代码示例:

while (<STDIN>) {
...
}


foreach (<STDIN>) {
...
}

使用这种写法,行输入的数据被存储在默认的标量变量$_中,
当然也可以显式的将行输入数据赋给一个已定义的标量变量中,如$line。

上述两个循环的区别是:
while循环每次处理一行数据,而foreach循环会首先读入全部输入,然后在逐行处理。
所以,如果输入的文件很大,最好使用while循环。

2.从钻石操作符(<>)进行输入

钻石操作符被设计用来处理命令行参数(或者称为“调用参数”),可以看作是特殊的行输入操作符。
例如:
 

复制代码 代码示例:
./my_program fred barney betty

my_program是命令,后面的fred、barney和betty是这个命令的命令行参数,
可能是三个文件的名字(若从标准输入进行输入,则用-表示)。
钻石操作符的作用是从命令行参数中连续获得输入数据,好像将这三个文件合并成一个大的文件后,逐行输入似的。如下所示:
 

复制代码 代码示例:
while (<>) {
chomp;
print "It was $_ that I saw!n";
}
 

这个循环的会依次从fred、barney和betty这三个文件中读取输入,然后逐个打印出来。

3.调用参数
命令的调用参数实际存储在Perl预设的数组@ARGV中,钻石操作符从@ARGV数组中获得命令行参数信息。
譬如上面的例子中(./my_program fred barney betty),
@ARGV数组中的元素为:$ARGV[0] = fred, $ARGV[1] = barney, $ARGV[2] = betty。
程序自己的名字被存储在Perl的特殊变量$0中。

可以在程序开始后和使用钻石操作符前调整@ARGV,从而改变处理的参数(可能不是命令行参数了)。
例如,下面可以处理三个指定的文件,不论用户在命令行中输入了什么参数:
@ARGV = qw /larry moe curly/; # 强制读取这三个文件
 

复制代码 代码示例:
while (<>) {
...
}

4.向标准输出进行输出
使用print函数向标注输出进行无格式的输出,如:print "Hello, I'm here!n";
使用printf函数向标准输出进行格式化的输出,格式化操作和C语言类似,如:printf "Hello, %s. Your password expires in %d days! n", $user, $days_to_die;
格式字符串含有几个所谓的转换,每个转换以一个百分号(%)开始,以一个字母结束;在后面列表中的条目数目应该与转换的个数相同,如果它们不匹配,就很难正确工作。
%g:g表示General,要按一般较合适的方式打印一个数字,可以使用%g,它会根据需要自动选择浮点、整数,甚至是指数表示;
%d:表示十进制整数,会根据需要对数据进行截取(注意,不是舍入);类似的,%x表示十六进制,%o表示八进制;在d前面加上整数,可以表示需要打印的字段宽度,若整数为负数,则表示左对齐;
%s:表示一个字符串,它按字符串进行给定值的替换,但有一个给定的字段宽,譬如,printf "sn", "wilma";
%f:表示浮点数,它会根据需要进行舍入,可以指定小数点后的位数,譬如,printf ".3fn", 6*7 + 2/3;
%%:打印一个真正的百分号,它的特殊之处在于它不需要列表中的元素与之对应。