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"があります。Learning Perlの本もあります。

Joel は、追加のタグとして文字列を使用することについて尋ねました。それはいいです; Perl では文字列をインクリメントできますが、その範囲はa-zとのみA-Zです。base 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 に答える