您的位置:首页 > 其它

Learning Perl(Perl语言入门)学习笔记(15)

2009-01-22 12:39 211 查看
第十六章 一些高级Perl技术

1、 在程序运行里,可以使用eval 块表达式(块后的分号不能省略,因为是表达式)来捕获严重错误,以防止程序运行时崩溃;其捕获结果存储于特殊变量 $@ 中,$@为空(“假”)时表示执行成功,否则,就表示执行过程中发生了错误,其内容为错误信息(布尔表达式结果为“真”),如:
print “An error occurred: $@” if $@;
2、 可以对eval 代码块进行嵌套,内部块在执行时捕获的错误不会接触到外部的代码块;eval 会捕获它在执行期间所发生的任何错误,包括调用子例程时的错误;
3、 eval 块是表达式,因而有其返回值,在没有错误发生里,其返回值由最后一个表达式计算结果或return关键字返回;有错误发生时,返回值为undef或空列表;有四种错误eval 无法捕捉:
a) 导致了Perl本身崩溃的严重错误;
b) eval 块里的语法错误;这会在编译期间被获取;
c) 在程序出错时由exit 函数退出的进程;若以die 结束则可以;
d) 警告信息;因为警告信息的机制跟eval 是分开的;
4、 grep 函数(与Unix中的grep重名)使用正则表达式来从文件中找出匹配成功的各行数据,使用格式如:
my @matching_lines = grep {/pattern/ } <FILE>;
其中,如果选择器(selector,如,/pattern/)表达式是简单表达式而非块,则可以使用如下格式:
my @matching_lines = grep /pattern/ , <FILE>;
5、 map 函数对指定列表中的每个元素以一个指定的代码块或表达式进行求值运算,并将计算结果以列表形式返回;在代码块中,map使用局部的$_指代当前列表元素;
6、 散列中,如果散列键仅由字母、数字与下划线组成,而且开头不是数字,则可以省略包裹它的引号;这些没有引号修饰的简单文字称为未经修饰的文字(bareword);因此,在散列元素引用的花括号里可以将形如$hash{“key”} 写作$hash{key},不过,如果有别的内容出现在花括号中则可能会被解读为表达式;另外,在为以“键―值对”的形式为散列元素赋值时,如果使用大箭号(=>),则大箭号会自动视其前的“键”已经加上引号;
7、 Perl 可以把列表当数组,用索引取得里面的值,这称作列表切片(list slice);如:
my $mtime = (stat $some_file)[9];
圆括号必须括住所要处理的项目列表(如上例中的stat的返回值),而且其后必须是方括号[]括起来的下标表达式;例如,如果想在某个排序的结果中取得第一个元素和最后个元素,则可以使用用:
my($first, $last) = (sort @names)[0, -1]
其中,-1表示最后一个元素;切片的索引值可以是任意顺序,也可以重复;
也可以在split 操作后取得某个或某些值,如:
my($uid, $gid) = (split /:/ )[2,3]
8、 在使用数组切片时,可以省略外面的圆括号,因为在Perl中,@符号代表“所有的元素”;切片一定都是列表;变量引用所前置的标点符号所前置的符号(@或$)决定了下标表达式的上下文,$符号时,表达式会在标量上下文求得索引值,@符号时,会得到由索引值返回的列表;
9、 散列亦可以切片,跟数组只有元素引用方式上的不同,如:
数组:my @passwords = @passwd[0, 2, 6, 8];
散列:my @family_names = @employees{qw/ tom jerry tim/ };
散列切片也可以被替换进字符串里;
本文出自 “Marion的BLOG” 博客,请务必保留此出处http://marion.blog.51cto.com/22948/135210
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: