切片
列表切片
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的表达式在列表上下文中求值,可以返回多个元素。