免费注册 查看新帖 |

Chinaunix

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

脚本求debug [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-27 16:05 |只看该作者 |倒序浏览
本帖最后由 davexu2 于 2014-03-27 16:08 编辑

输入文件1格式,tab键分隔,共10列。其他列均不为空:
chr1    955597
chr1    984302  
chr1    1431165
chr1    1558792
chr1    1562080
chr1    3414105
chr1    3416449
chr1    6162054
输入文件2格式,tab键分隔,共15列,其他列不为空:
1       2       chr1    0       10000
2       2       chr1    10000   12820
3       2       chr1    12820   12828
文件2中,4,5列是区间。文件1第2列中,任何一个数字都会在文件2的某个区间中。这个区间的数字,临行的首尾是重复的。
文件1的第一列和文件2的第三列还需要先匹配,才能开始找区间。
理论上来说,文件1中所有行都执行匹配,所以不会执行遍历哈希那一步。但实际上,有大约1半的输出是遍历哈希得到的。不知道bug在何处,求大神指导。
脚本如下:
#!/usr/bin/perl -w
use strict;
use FindBin qw($Bin $Script);
my ($line,@tmps,%hash);
open IN,"$ARGV[0]";
while($line=<IN>){
        chomp $line;
        @tmps=split /\t/,$line;
        $hash{$tmps[0]}{$tmps[1]}=$line;
}
close IN;
open OUT,">$ARGV[2]";
open BZ2,"bzip2 -dc $ARGV[1]|";
while($line=<BZ2>){
        next if ($line=~ /^#/);
        chomp $line;
        @tmps=split /\t/,$line;
        next unless $hash{$tmps[2]};
        my $res=&mini($hash{$tmps[2]});
        next if !defined$res;
        print OUT "$res\t$tmps[3]\t$tmps[4]\t".($res>$tmps[3])."\t".($tmps[4]>$res)."\n";
        if( exists $hash{$tmps[2]}{$tmps[4]}){
                print "$hash{$tmps[2]}{$tmps[4]}\t$tmps[2]\t$tmps[3]\t$tmps[4]\t$tmps[5]\t$tmps[6]\n";
                delete $hash{$tmps[2]}{$tmps[4]};
        }
        elsif(($res>$tmps[3])and($tmps[4]>$res)){
                print "$hash{$tmps[2]}{$res}\t$tmps[2]\t$tmps[3]\t$tmps[4]\t$tmps[5]\t$tmps[6]\n";
                delete $hash{$tmps[2]}{$res};
                redo;
        }

}
close BZ2;
#下面的语句理论上不会执行
foreach my $mkey(sort keys %hash){
        foreach my $skey(sort keys %{$hash{$mkey}}){
                print "$hash{$mkey}{$skey}\n";
        }
}
#上面理论上不会执行
sub mini{
        my @par=@_;
        my $res;
        my @tmp=sort {$a<=>$b} keys %{$par[0]};
        $res=$tmp[0];
        $res;
}

论坛徽章:
0
2 [报告]
发表于 2014-03-27 17:06 |只看该作者
bug已解决……在if里面加上redo;就好了。其实貌似把if和elsif合并成一句,改为:
if(($res>$tmps[3])and($tmps[4]>=$res)){
                print "$hash{$tmps[2]}{$res}\t$tmps[2]\t$tmps[3]\t$tmps[4]\t$tmps[5]\t$tmps[6]\n";
                delete $hash{$tmps[2]}{$res};
                redo;
        }
似乎更好

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2014-03-31 00:00 |只看该作者
没看明白, 这个问题有点难

论坛徽章:
0
4 [报告]
发表于 2014-04-03 16:06 |只看该作者
应该是我描述的问题……不过最终在别人的帮助下解决了……debug是个很费脑子的事情……回复 3# rubyish


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP