Perl笔记:Perl语言入门(第六版) - 切片、捕获错误

来源:互联网 发布:hadoop书籍推荐 知乎 编辑:程序博客网 时间:2024/04/27 17:05

切片

列表切片

my $mtime = (stat $some_file)[9]; #圆括号不能省略

my ($card_num, $count) = (split /:/)[1, 5]; #一次取出多个值,下标可以使用负值,顺序可以是任意的,可以重复。

数组切片

数组切片的圆括号可以省略

my @numbers = @names[ 9, 0, 2, 1, 0];

切片可以直接内插到字符串中。

哈希切片

my @three_scores = @score{ qw/ barney fred dino/ };

捕获错误

eval

捕获代码运行时,可能出现的严重错误。 eval { $barney = $fred / $dino }; #结尾有分号,eval是表达式。

eval的返回值就是语句块中最后一条表达式的执行结果。

上述变形后的写法:

my $barney = eval { $fred / $dino };

$barney变量位于eval外部,便于后续处理。

捕获到错误时,返回undef,故可用定义或操作符对变量设定默认值。返回的错误消息在$@中。

如果测试的部分没有有意义的返回值,需要构造有返回值的代码块

unless ( eval { some_sub(); 1} ) { #出现错误最后一句代码不会执行。

print "I couldn't divide by \$dino: $@ if $@;

}

列表上下文,eval捕获错误,返回空列表。

eval块也可以设定词法变量的作用域,并且块内的语句数目不限。

eval可以嵌套。

grep筛选列表

my @odd_numbers = grep { $_ % 2 } 1..1000; #第一个参数是代码块(如正则表达式),以$_为列表元素返回布尔值,第二个参数为待筛选的列表。

map对列表元素变形

my @format_data = map { &big_money($_) } @data;

参数和grep类似,但代码块返回的是实际的计算结果,最终返回一系列被处理的结果。而且map的表达式在列表上下文中求值,可以返回多个元素。

0 0