免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1854 | 回复: 1
打印 上一主题 下一主题

Perl的一些代码阅读和探讨,欢迎指教 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-22 07:03 |只看该作者 |倒序浏览
---阅读对象:某code
---字典:perl doc


片段1:
@sortedlist=reverse(sort { @tempa = split(/\t/,$a); @tempb = split(/\t/,$b); $tempa[9] cmp $tempb[9] || $tempa[0] <=> $tempb[0]; } @temp);


笔记:
$tempa[9] cmp $tempb[9] || $tempa[0] <=> $tempb[0];
先比较ID并排序(字符),如果一致,再比较match的大小(数字)。
参考perl-doc后,这个代码貌似有更高效率的写法,perl-doc例子:
# same thing, but much more efficiently;
# we'll build auxiliary indices instead
# for speed
my @nums = @caps = ();
for (@old) {
push @nums, ( /=(\d+)/ ? $1 : undef );
push @caps, uc($_);
}
my @new = @old[ sort {
$nums[$b] <=> $nums[$a]
||
$caps[$a] cmp $caps[$b]
} 0..$#old
];
但是,为什么做了index就更快呢?做index本身也要消耗时间啊,看来还得明白sort函数是怎么写的吧,也欢迎达人留言指教。     


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
片段2:
while(<ALL>{
        chomp;
        @temp = split(/\t/,$_);
        if($_=~/^\d+/){
                if(!defined $BestPSL{$_}){

                print OUT "$_\n";

                }
        }

}
用while和hash替代了一个可能的双for loop..
对比双for loop,代码优点在于:
1. while(<>是逐行读入,不占内存,没有等待读入内存的时间。
2. if(!defined $BestPSL{$_})巧妙的搜索了data,速度很快。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
片段3:
use Getopt::Std;
use vars qw($opt_i $opt_o $opt_g $opt_c);
getopts('i:g:c:');

$Input=$opt_i;
$Output=$opt_o;
$AllowedGap = $opt_g;
$Color = $opt_c;

getopts 是ARGV的进阶版本,利器啊,这样写大型些的代码时,程序就没有那么凌乱了 。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
片段4:
foreach (sort {$a cmp $b} keys %chr_len){
....
}

此处利用了perl的左向变量传递,但是,这和如下代码比,好在哪里呢?

my @key=keys(%chr_len);
my @sorted=sort{$a cmp $b} @key;

foreach(@sorted){
...
}
难道只是少定义点变量,少用点内存么?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-03-22 09:18 |只看该作者
第一个自己 Benchmark,没数据。不过原来的写法是挺慢的,每次比较都要 split。
第二个用 exists 测试存在性是不是更清晰点?
第四个没什么实际区别,注意好上下文分开写和写一起没什么区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP