[2016/12/8]我的第一个perl程序

程序功能

读入一系列文件,按照给出的条件计算特定链上两两氨基酸之间的距离并输出到文件。

程序不足及吐槽

头一次接触perl,竟然能写出来。。撒花!第一次学新语言,写的第一个程序不是hello world哈哈哈,感觉还不错。
其实这个完全不用写程序解决,直接用以前的c代码复制粘贴,用的时间还不及写程序的时间。但是!程序猿怎么能做这种体力活。虽然花费时间很长,但是写出来还是很开心的。
perl真的比c慢很多啊。。用c写这个几很快跑出来了,计算量还是加倍的。但是明显perl方便很多,c处理内存处理得想掀桌。(不过perl的正则表达式也用得想掀桌。。)
为了节省时间,没有多做优化。程序的时间复杂度简直爆炸,虽然是自己写出来的但还是很嫌弃。。
数据格式!!实在!!太重要!!!遇到奇怪的bug才发现是数据格式问题。一会是中文字符一会又是英文字符,让我很为难啊啊啊!!没办法只好用其他文本编辑器修改成了统一格式。

遇到的bug

本来昨晚十点多就把所有功能都完成了,但是遇到了一个问题,输出结果都是0。感觉很奇怪,找了找发现是打开文件失败的问题,错误信息显示找不到此文件。但是把文件名print了一遍,统统和硬盘上的文件名一毛一样。感觉很奇怪,于是今天早上来把文件名都print到文件里。这个时候发现问题了。每个文件名前都有奇怪的字符,就像这种:^F,在sublime里查看占一个字符长度。虽然不知道为什么(猜测是字符串分段的时候出了问题),然后又百度了一下,用一个正则表达式处理好了。它的功能是只保留ASCII码数据。(就是这个)果然完美解决!

代码

$bigfile = "1.
文件名:4zqk.pdb
链.B链;氨基酸序号:75,132,66,78,68,76,136,77,128,126,134
链.A链;氨基酸序号:19,26,66,121,122,123,124,125,54,115,113
2.
文件名:5b8c_ABC.pdb
链.C链;氨基酸序号: 63,128,61,131,86,75,78,87,77,85,76,66,68,64
链.B链;氨基酸序号:30,33,35,54,59,99,101,102,103,105
链.A链; 氨基酸序号:34,53,57,60,96,54
3.
文件名:5ggr_ABY.pdb
链.Y链; 氨基酸序号:27,28,29,30,31,60,61,128,129,130,131,132,133
4.
文件名:5ggt_AHL.pdb
链.A链; 氨基酸序号:49,56,69,49,54,115,68,58,54
链.H链; 氨基酸序号:105,59,106,32,52,55,108,94,57
5.
文件名:5grj_HLA.pdb
链.A 链; 氨基酸序号:66,58,113,56,117,61,60,115,76,61
链.H 链;氨基酸序号:31,52,54,55,105,106,57,101
6.
文件名:5ius_AC.pdb
链.A链; 氨基酸序号:68,70,78,134,136,126,128,132,70
链.C链; 氨基酸序号:122,125,124,113,123,115,54
7.
文件名:5JXE_BCD.pdb
链.B链;氨基酸序号:87,128,76,78,85,64
8.
文件名:mmd(gromacs).pdb 
链.B链; 氨基酸序号:135,136,78,126,134
链.A链; 氨基酸序号:58,60,113,122,123,125,115
9.
文件名:aftermpd1mpdl1.pdb
链.B链;氨基酸序号:78,75,133,132,131,76,77,126,134
链.A链;氨基酸序号:19,26,58,61,66,73,121,124,125,115,58,61
10.
文件名:aftermutantmd.pdb
链.A链; 氨基酸序号:46,48,55,56,58,65,112,115,116,114
链.B链;氨基酸序号:121,122,123,125,124,19,120,66,61,113,115,18
11.
文件名:mPD1hPDL1after.pdb
链.B链:氨基酸序号:78,75,133,132,136,68,76,74,128,126,134
链.A链; 氨基酸序号:18,26,56,61,66,113,121,123,124,125,54,115";

@bigfile_seg = split(/\n/,$bigfile);
$temp = 0;
open (OUTFILE,">>./outfile");
while($temp <= $#bigfile_seg){
    if($bigfile_seg[$temp] =~ m/^[0-9]+[.]/){    ##从开头开始,匹配此格式:(一次或多次)数字 + .
        #print "$bigfile_seg[$temp]\n";
        $temp++;
        $file_pos = index($bigfile_seg[$temp],":");
        $file = substr($bigfile_seg[$temp], $file_pos+2);
        #printf "$file\n";
        $temp++;
        while(index($bigfile_seg[$temp],"链") != -1){
            $chain = $bigfile_seg[$temp];
            @str = split(/[.]/,$bigfile_seg[$temp]);
            $chain = $str[1];
            @str = split(/[链]/,$chain);
            $chain = $str[0];
            @haha = split(/氨基酸序号:/, $bigfile_seg[$temp]);
            $haha[1] =~ s/^\s+//;
            $haha[1] =~ s/\\s//g;
            @string = split ',', $haha[1];

            my %hash;#去重
            @string = grep { ++$hash{$_} < 2 } @string;

            for ($i = 0; $i <= $#string; $i++) {

                $res1 = $string[$i];
                for($j = $i+1; $j <= $#string; $j++)
                {

                    $res2 = $string[$j];
                    $file =~ s/^\s+//;
                    $file =~ s/\\s//g;
                    $file =~ s/[^\040-\176]//g;

                    open(F,$file);
                    while(<F>){
                        @at = split(/ +/g,$_); # $at[6,7,8] position; $at[5]: res; $at[4]: chain; $at[2]: CA; $at[3]: residue 
                        if($at[0]=="ATOM" && $at[2]=="CA" && $at[4]==$chian && $at[5]==$res1){
                                $x1 = $at[6];
                                $y1 = $at[7];
                                $z1 = $at[8]; 
                                $residue1 = $at[3];
                            }

                        if($at[0]=="ATOM" && $at[2]=="CA" && $at[4]==$chian && $at[5]==$res2){

                                $x2=$at[6];
                                $y2=$at[7];
                                $z2=$at[8]; 
                                $residue2=$at[3];
                        }

                    }
                    close F;

                    $z=sqrt( ($x1-$x2)**2 + ($y1-$y2)**2 + ($z1-$z2)**2 );

                    print OUTFILE "The CA distance between $residue1$res1 and $residue2$res2 in chain $chain in $file is $z\n";

                    #print ;

                }

            }
            $temp++;
        }

    }
}
close(OUTFILE);


=chm
$file="4zqk.pdb";
$chain="B";
@string=(78,75,132,66,78,68,76,136,77,128,126,134);
print "len : $#string";


=cut

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值