Chinaunix

标题: 大侠帮忙改改代码啦 [打印本页]

作者: camus1984    时间: 2010-12-02 15:40
标题: 大侠帮忙改改代码啦
小弟才学perl不久,下面这个代码是实现每个字符在每个位置上出现的次数,主要用在生物信息中的氨基酸频率统计
用hash完成的,写完后,发现跟我在C#里写的思路完全一样,貌似没有找到perl的感觉啊,所以请大虾帮忙看看,怎么写能更好呢?谢谢啦~
  1. use strict;
  2. use warnings;

  3. my @testSet = ("ACDE","ADEF","DEFG","EFGH");
  4. my %hashTable ;
  5. foreach my $seq(@testSet){
  6.         for(my $i=0;$i<length($seq);$i++){
  7.                 my $aminoAcid= substr($seq,$i,1);
  8.                 my $tempKey=$aminoAcid."$i";
  9.                 if(exists $hashTable{$tempKey}){
  10.                         $hashTable{$tempKey} +=1;
  11.                 }
  12.                 else{
  13.                 $hashTable{$tempKey}= 1;
  14.                 }
  15.         }
  16. }
  17. while ((my $key,my $value) = each %hashTable) {
  18.         print "$key=$value\n";
  19. }
复制代码

作者: 小鹭    时间: 2010-12-02 16:22
本帖最后由 小鹭 于 2010-12-02 17:12 编辑

perl -ne 'chomp; @str=split(//); for ($i=0; $i<scalar(@str); $i++) {$rec{$str[$i].$i}++} END{foreach (keys %rec) {print "$_ $rec{$_}\n"}}' bio.txt


E0 1
D2 1
G3 1
E1 1
D1 1
C1 1
D0 1
G2 1
E2 1
F2 1
F3 1
A0 2
F1 1
H3 1
E3 1

感觉还不是很利索,还有修改的余地。
作者: li_000828    时间: 2010-12-02 16:22
  1. #!/usr/bin/perl
  2. @testSet = ("ACDE","ADEF","DEFG","EFGH");
  3. @tem=split //,(join '',@testSet );
  4. for(@tem)
  5. {
  6.   $hash{$_}++;
  7. }
  8. print map {"$_ => $hash{$_}\n"} sort keys %hash;
复制代码

作者: 昭襄王    时间: 2010-12-02 16:26
初学,试着写了个,感觉那个$i比较多余,能用$.吗?
  1. @test_set = qw/ACDE ADEF DEFG EFGH/;
  2. for (@test_set){
  3.   @c = split //;
  4.   $i = 0;
  5.   for $x (@c){
  6.     $hash{$x.$i}++;
  7.     $i++;
  8.   }
  9. }
  10. for $key (keys %hash){
  11.   print "$key=$hash{$key}\n";
  12. }
复制代码

作者: wfnh    时间: 2010-12-02 16:48
回复 4# 昭襄王

$.用在文件句柄里····不要唔会了··
作者: 昭襄王    时间: 2010-12-02 16:51
回复  昭襄王

$.用在文件句柄里····不要唔会了··
wfnh 发表于 2010-12-02 16:48



    哦,明白了,多谢!
作者: wfnh    时间: 2010-12-02 16:56

  1. my @testSet = ("ACDE","ADEF","DEFG","EFGH");
  2. my %hash;
  3. map{$_ => $hash{$_}++} map{split ''} @testSet;
  4. print "$_ => $hash{$_}\n" for (sort keys %hash);

复制代码

作者: camus1984    时间: 2010-12-02 17:00
谢谢大家的回复
晚上吃完饭研究一下
作者: 昭襄王    时间: 2010-12-02 17:02
回复 7# wfnh


    审题不认真,不单纯是统计字母
统计字母在不同字符串中的同一位置
./pl025
E0=1
D2=1
G3=1
E1=1
D1=1
C1=1
D0=1
G2=1
E2=1
F2=1
F3=1
A0=2
F1=1
H3=1
E3=1
作者: wfnh    时间: 2010-12-02 17:03
回复 9# 昭襄王

的确···
我改一下··
作者: 小鹭    时间: 2010-12-02 17:12
本帖最后由 小鹭 于 2010-12-02 20:07 编辑

perl -ne 'chomp; $i=0;s/(\w)/$1 . $i++ . " "/ge; @str=split(/ /); map{$_, $test{$_}++} @str; END{foreach (keys %test) {print "$_ $test{$_}\n"}}' bio.txt

map{$_, $test{$_}++} @str 改成map{ $test{$_}++} @str更简洁一点。
作者: 昭襄王    时间: 2010-12-02 17:18
perl -ne 'chomp; $i=0;s/(\w)/$1 . $i++ . " "/ge; @str=split(/ /); map{$_, $test{$_}++} @str; END{for ...
小鹭 发表于 2010-12-02 17:12



    很霸道的想法。学习。
作者: 小鹭    时间: 2010-12-03 11:37
给一个精悍一些的

perl -aF'' -ne 'for ($i=0; $i< scalar(@F); $i++) {$F[$i] !~ /\n/ and $a{$F[$i] . $i}++;}END{foreach (keys %a){print "$_ $a{$_}\n"}}' bio.txt
作者: kingwmj    时间: 2010-12-03 17:01
学生物信息的,同行顶一个。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2