2
#!/usr/bin/perl
use strict;
use warnings;

# (1) program reads file
# (2) uses the split fxn to split the columns
# (3) loads the IDs that begin with FBgn from the 1st column as keys to a hash
# (4) loads the gene symbol from the second column as the value in each hash entry

my $infile = "fb_synonym_fb_2013_05.tsv";

open( FILE, "<", $infile )
    or die "Cannot open file $!";

my @data = <FILE>;

foreach my $line (@data) {
    my @column = split( /\s+/, $line );
    #print $column[0],"\n";
    my $columnID = $column[0];
        foreach ( my $columnID ) {
            while ( $columnID =~ /(^FBgn\d+)/ ) {
                my $ID = $1;
                print $ID, "\n";
            }
        }
 }

コードを実行しようとしましたが、$columnID は初期化されていない値であると表示されます。私はこの時点で立ち往生しています。「FBgn」で始まる列を選択する必要があります

入力: データ ファイルが非常に大きいため、ここで選択します

##primary_FBid current_symbol current_fullname fullname_synonym(s) symbol_synonym(s)
FBtr0000004 Ecol\lacZ[svp-3]RA      lacZ[svp-3]RA
FBtr0000005 Ecol\lacZ[hkb-5953]RA       lacZ[5953]RA,lacZ[hkb-5953]RA,hkb-  lacZ,5953
FBtr0000007 Mab4A11[+]R2.1          
FBtr0000009 Ecol\lacZ[betaTub56D.AS1]RA lacZ[betaTub56D.AS1]RA
FBtr0000010 Ecol\lacZ[betaTub56D.AS2]RA lacZ[betaTub56D.AS2]RA
FBtr0000011 Ecol\lacZ[betaTub56D.AS3]RA lacZ[betaTub56D.AS3]RA
FBtr0000012 Ecol\lacZ[betaTub56D.NN]RA  lacZ[betaTub56D.NN]RA
FBtr0000013 Ecol\lacZ[betaTub56D.NC]RA  lacZ[betaTub56D.NC]RA
FBtr0000014 Ecol\lacZ[betaTub56D.CP]RA  lacZ[betaTub56D.CP]RA
FBtr0000015 Ecol\lacZ[betaTub56D.ACO]RA lacZ[betaTub56D.ACO]RA
FBtr0000016 Ecol\lacZ[betaTub56D.AC3]RA lacZ[betaTub56D.AC3]RA
4

3 に答える 3

4

このセクションに論理的な問題があると思われます。

my $columnID = $column[0];
foreach ( my $columnID ) {
    while ( $columnID =~ /(^FBgn\d+)/ ) {
        my $ID = $1;
        print $ID, "\n";
    }
}

各行を繰り返し処理し、その行を列に分割することから始めます。ここまでは順調ですね。

次に、最初の列を取り、それを scalar に入れ$columnIDます。また、結構です。これが定義されているかどうかを確認する価値があります (空白行がある場合)。

問題は次の行にあります。

foreach ( my $columnID )

あなたは正確に何を繰り返していますか?新しい変数 (の新しいインスタンス$columnID- $columnID を上記に設定したものが非表示になるため、絶対に実行したくない) を宣言しますが、... この行は役に立ちません。

次にあなたが持っている:

while ( $columnID =~ /(^FBgn\d+)/ ) {

...別のループ。しかし、あなたはそれを必要としません。これが真か偽かを知りたいだけです:

if ( $columnID =~ ... ) {
    # action if true
}

まとめ: コードを次のように書き直してみてください。

my @data = <FILE>;

foreach my $line (@data) {
    my @column = split( /\s+/, $line );
    my $columnID = $column[0];
    next if ( ! defined( $columnID ) ); # bad line

    if ( $columnID =~ /(^FBgn\d+)/ ) {
        my $ID = $1;
        print $ID, "\n";
    }
}
于 2013-10-27T19:56:05.987 に答える
0

$columnID変数を事前に定義し$ID、ループの外でそれらを割り当てる必要があります。また、2回定義my $columnIDしました。

試す:

my @data = <FILE>;
my @column;
my $columnID;
my $ID;

foreach my $line (@data) {
    @column = split( /\s+/, $line );
    #print $column[0],"\n";
    $columnID = $column[0];
    if ( $columnID =~ /(^FBgn\d+)/ ) {
        $ID = $1;
        print $ID, "\n";
    }
 }
于 2013-10-27T19:54:10.893 に答える