0

我想生成一个唯一ID 列表。因为有些 ID 是重复的,所以我需要在末尾添加一个数字以使其唯一,如下所示:

ID=exon00001
ID=exon00002
ID=exon00003
ID=exon00004

这是我到目前为止所拥有的。

 while (loop through the IDs) {
 # if $id is an exon, then increment the counter by one and add it 
 # to the end of the ID
    if ($id =~ m/exon/) {
    my $exon_count = 0;
    my @exon = $exon_count++; #3
    $number = pop @exon; # removes the first element of the list
    $id = $id.$number;
    print $id."/n"
    }
    }

基本上我想动态生成一个带有计数器的数组。它应该为外显子的总数创建一个数组 (1, 2, 3, 4, ...),然后删除元素并将其添加到字符串中。此代码无法正常工作。我认为第 3 行有问题。你们知道吗?有任何想法吗?谢谢你

4

3 回答 3

1

正如我在评论中所指出的,您的代码无法编译,也无法正常工作。首先计算重复次数,然后根据找到的 id 打印正确的重复次数。使用printf将适合格式化您的号码。

my %seen;
my @ids = ( bunch of ids );

map $seen{$_}++, @ids;  # count the duplicates

for my $id (keys %seen) {
    for my $num (1 .. $seen{$id}) {
        printf "%s%05d\n", $id, $num;
    }
}
于 2012-04-04T23:26:40.967 回答
1

这是你需要的吗?计数器需要保留其值,因此您不能按原样继续重置它:

use v5.10;

my $exon_count = 0;
while( my $id = <DATA> ) {
    chomp $id;
    if( $id =~ m/exon/ ) {
        $id = sprintf "%s.%03d", $id, $exon_count++;
        }
    say $id;
    }

__END__
ID=exon00001
ID=exon00002
ID=exon00003
ID=exon00004

输出如下所示:

ID=exon00001.000
ID=exon00002.001
ID=exon00003.002
ID=exon00004.003

如果您使用的是 5.10 或更高版本,则可以使用state在循环内声明变量,但让它保持其值:

use v5.10;

while( my $id = <DATA> ) {
    chomp $id;
    state $exon_count = 0;
    if( $id =~ m/exon/ ) {
        $id = sprintf "%s.%03d", $id, $exon_count++;
        }
    say $id;
    }

我认为你是 Perl 的新手,因为你的代码看起来像是一堆不相关的东西,它们的作用可能与你想象的大不相同。有一个针对生物学家的 Perl 教程,“Unix and Perl”。还有我的学习 Perl书。

Joel 询问是否使用字符串作为附加标签。没关系; Perl 允许你增加一个字符串,但仅限于范围a-zA-Z。我们可以通过使用以 36 为基数的数字标签来混合数字和字母:

use v5.10;

use Math::Base36 'encode_base36';

while( my $id = <DATA> ) {
    chomp $id;
    state $exon_count = 30;
    if( $id =~ m/exon/ ) {
        $id = sprintf "%s.%-5s", $id, encode_base36($exon_count++);
        }
    say $id;
    }

现在你有这样的标签:

ID=exon00003.1Q   
ID=exon00004.1R   
ID=exon00001.1S   
ID=exon00002.1T   
ID=exon00003.1U   
ID=exon00004.1V   
于 2012-04-04T23:30:54.740 回答
0

您想为这些外显子生成一个唯一 ID 列表(输出到 GFF 文件中?)。

您必须确保在循环之外初始化计数器。我不确定你想用数组完成什么。但是,下面的程序将根据您发布的格式(exon00001 等)生成唯一的外显子 ID。

my $exon_count=0;

while(my $id=<SOMEINPUT>){
      if($id=~m/exon/){
            $exon_count++;
        my $num='0' x (5 - length $exon_count) . $exon_count;
            print "$id$num\n";
      }
}
于 2012-04-04T23:35:03.163 回答