blue1025的个人空间 https://blog.eetop.cn/mj8051 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

第16章 Perl的高级技巧

已有 1067 次阅读| 2008-9-28 11:33 |个人分类:PERL

SOURCE HMTL: http://socvista.com/bbs/redirect.php?fid=71&tid=955&goto=nextnewset

用eval来避免程序退出并获取出错信息

== 典型应用
出现fatal错误的时候,如何能让程序继续进行,同时报告出错原因呢?eval可以做到这点。
eval {
  ...
  怀疑会出错的代码段,包括各种循环控制结构等。
  ...
};
if ($@) {  # 出错结果自动保存在$@中
  print "An error occured ($@), continuing \n";
}

== 返回值
eval {}; 的返回值在正常情况下和括号内的返回值一致。
如果出错的话就返回undef或者空的list。这个视乎环境而定。

== 例外情况
要注意的是,不是所有error都可以用eval来获取的。
1. 令perl崩溃的error,比如run out of memory。
2. 语法错误。
3. exit会立即终止程序。eval无法阻止。
4. 各类warning。

用grep从list中选出符合条件的项

举几个例子,一看便知。
my @odd_numbers = grep { $_ % 2} 1..1000;  # $_ 和后面1..1000对应
my @matching_lines = grep { /\bfred\b/i } <FILE>; # { } 花括号内是grep选择的条件,可以是计算式也可以是匹配式。

对整个 list 的数据进行相同的处理——map

比较直观的方法是对list执行循环,逐个元素进行处理。
perl提供了一个map函数,方便进行此类操作。其格式为,
my @formatted_data = map { &format_subroutine_name($_) } @data;
如果没有返回值,而只是进行某类处理则格式如下,
map { &process_subroutine_name($_) } @data;
比如
map { sprintf( "%25s\n", $_ ) } @data;

另外一种建立hash的方法

my %score = (
  barney => 195,
  fred => 205,
  dino => 30,
);

undef 变量的用途

while (<FILE>) {
  my ($name, $addr, undef, undef) = split /:/;
  ...
}
这里的undef表示对split产生的list中的第三项和第四项不感兴趣,也就是忽略这两项的意思。

list 的一部分——slice

my $mtime = (stat $some_file)[9]; # 表示stat产生的list的第9项
my $count = (split /:/)[5];
my ($num, $count) = (split /:/)[1,5];
my ($first, $last) = (sort @names)[0,-1];
my @numbers = (@names)[9,0,2,1];  # 顺序可以随意
上面的例子可以缩写为:
my @numbers = @names[9,0,2,1];  # 顺序可以随意

hash 的 slice

补充说明一下:slice 始终都还是一个 list ,一般由原来的list处理后产生。
hash也有slice。
比如一般的写法:
my @three_scores = ($score{"barney"}, $score{"fred"}, $score{"dino"});
采用slice写法:
my @three_scores = @score{qw/ barney fred dino /});
其他的例子:
@score{@players} = @bowling_scores;
print "@score{ @players }";









点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 13

    粉丝
  • 16

    好友
  • 15

    获赞
  • 23

    评论
  • 2824

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 07:34 , Processed in 0.017675 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部