3

私のタスクは、次のデータ ファイルから平均を計算することですLab1_table.txt

retrovirus      genome  gag     pol     env
HIV-1           9181    1503    3006    2571
FIV             9474    1353    2993    2571
KoRV            8431    1566    3384    1980
GaLV            8088    1563    3498    2058
PERV            8072    1560    3621    1532

このファイルを開いて読み取り、内容を配列に分割して各行を読み取り、数値の平均 ( genomegag、 ) を計算しpolenvそれぞれの平均を新しいファイルに書き込むスクリプトを作成する必要があります。前述のコラム。

最初の行または最初の列を考慮しない方法を見つけようと最善を尽くしてきましたが、コマンドラインで実行しようとするたびに「明示的なパッケージ名」エラーが発生し続けます。

Global symbol @average requires explicit package name at line 23.
Global symbol @average requires explicit package name at line 29.
Execution aborted due to compilation errors.

@これにはとが含まれることを理解して$いますが、エラーを変更できなかったことを知っていても.

これは私のコードですが、先週始めたばかりの初心者であることを強調します。

#!/usr/bin/perl -w
use strict;

my $infile = "Lab1_table.txt"; # This is the file path
open INFILE, $infile or die "Can't open $infile: $!";

my $count = 0;
my $average = ();

while (<INFILE>) {
    chomp;
    my @columns = split /\t/;
    $count++;
    if ( $count == 1 ) {
        $average = @columns;
    }
    else {
        for( my $i = 1; $i < scalar $average; $i++ )  {
            $average[$i] += $columns[$i];
        }
    }
}

for( my $i = 1; $i < scalar $average; $i++ ) {
    print $average[$i]/$count, "\n";
}

洞察をいただければ幸いです。また、必要に応じて、各ステップで行っていることをリストに番号を付けてお知らせいただければ幸いです。私は学びたいと思っており、誰かのプロセスが何であるかを読むことができれば、それは私にとってより理にかなっています.

4

1 に答える 1

2

変更する必要があるポイントは次のとおりです
ヘッダーには別の変数を使用してください

my $count = 0;
my @header = ();
my @average = ();

次に、ifステートメント内のロジックを変更します

if ( $count == 1 ) {
    @header = @columns;
}

for を使用しないで、else ステートメントを@average使用してください。$i < scalar @columns最初@averageはゼロで、for ループの中に入ることはありません。

else {
    for( my $i = 1; $i < scalar @columns; $i++ )  {
        $average[$i] += $columns[$i];
    }
}

最後に-1カウンターに追加します。ヘッダーを解析するときにカウンターをインクリメントすることを忘れないでください

for( my $i = 1; $i < scalar @average; $i++ ) {
    print $average[$i]/($count-1), "\n";
}

これが最終的なコードです。結果をきれいに表示するために
利用できます@header

#!/usr/bin/perl -w

use strict;

my $infile = "Lab1_table.txt"; # This is the file path
open INFILE, $infile or die "Can't open $infile: $!"; 

my $count = 0;
my @header = ();
my @average = ();

while (<INFILE>) {
    chomp;


    my @columns = split /\t/;
    $count++;
    if ( $count == 1 ) {
        @header = @columns;
    }
    else {
        for( my $i = 1; $i < scalar @columns; $i++ )  {
            $average[$i] += $columns[$i];
        }
    }
} 

for( my $i = 1; $i < scalar @average; $i++ ) {
    print $average[$i]/($count-1), "\n";
}

このコードを記述する方法は他にもありますが、コードの何が問題なのかを簡単に理解できるように、コードを修正する方がよいと思いました。それが役に立てば幸い

于 2012-03-13T03:15:52.323 に答える