0

いくつかのタスクのために Perl プログラムを書くのに苦労しています。私は初心者であり、間違いを理解したいので、すべてのエラーを確認するのに非常に苦労しましたが、失敗しています. 願わくば、これまでのタスクと不完全なプログラムの説明が混乱を招かないことを願っています。

現在のディレクトリには、可変数の「.txt」があります。ファイル。(4、5、8、または任意の数のファイルを持つことができます。ただし、17 個を超えるファイルは得られないと思います。) 「.txt」ファイルの形式は同じです。空白で区切られた 6 つの列があります。これらのファイルの 2 つの列だけが重要です。2 番目の列はサンゴ礁の地域 ID (文字と数字で構成) で、5 番目の列は p 値です。各ファイルの行数は未定です。私がする必要があるのは、すべての .txt ファイルですべての共通の地域 ID を見つけて、これらの共通の地域を出力ファイルに出力することです。ただし、印刷する前に、それらを分類する必要があります。

以下はこれまでの私のプログラムですが、プログラムの後に含めたエラー メッセージを受け取りました。したがって、変数の私の定義は主要な問題です。プログラムを書くための提案があれば本当に感謝しています。

更新: 提案どおりに変数を宣言しました。プログラムを確認したところ、2 つの構文エラーが表示されました。

   syntax error at oreg.pl line 19, near "$hash{"
   syntax error at oreg.pl line 23, near "}"
   Execution of oreg.pl aborted due to compilation errors.

上記のエラーの場所を含む編集済みプログラムの抜粋を次に示します。

#!/user/bin/perl
use strict;
use warnings;
# Trying to read files in @txtfiles for reading into hash
foreach my $file (@txtfiles) {
  open(FH,"<$file") or die "Can't open $file\n";
  while(chomp(my $line = <FH>)){
    $line =~ s/^\s+//;      
    my @IDp = split(/\s+/, $line); # removing whitespace
    my $i = 0;
    # trying to define values and keys in terms of array elements in IDp
    my $value = my $hash{$IDp[$i][1]};
    $value .= "$IDp[$i][4]"; # confused here at format to append p-values
    $i++;       
  }                         
}

close(FH);

これらは過去のエラーです:

Global symbol "$file" requires explicit package name at oreg.pl line 13.
Global symbol "$line" requires explicit package name at oreg.pl line 16.
#[And many more just like that...]
Execution of oreg.pl aborted due to compilation errors.
4

2 に答える 2

2

あなたは宣言しませんでした$file

foreach my $file (@txtfiles) {

あなたは宣言しませんでした$line

while(chomp(my $line = <FH>)){

于 2013-03-16T20:24:22.847 に答える
0
use strict;
use warnings;

my %region;
foreach my $file (@txtfiles) {
  open my $FH, "<", $file or die "Can't open $file \n";
  while (my $line = <$FH>) {
    chomp($line);
    my @values = split /\s+/, $line;
    my $regionID = $values[1]; # 2nd column, per your notes
    my $pvalue = $values[4]; # 5th column, per your notes
    $region{$regionID} //= []; # Inits this value in the hash to an empty arrayref if undefined
    push @{$region{$regionID}}, $pvalue;
  }                         
}
# Now sort and print using %region as needed

このコードの最後にあるの%regionはハッシュで、キーはリージョンIDであり、値はさまざまなp値を含む配列参照です。

次の手順に役立つ可能性のあるスニペットを次に示します。

keys %regionsリージョンID値のリストが表示されます。

my @pvals = @{$regions{SomeRegionID}}SomeRegionIDのpvalueのリストが表示されます

$regions{SomeRegionID}->[0]その領域の最初のp値が得られます。

Data::PrinterまたはData::Dumperをチェックアウトすることをお勧めします。これらはCPANモジュールであり、データ構造を簡単に印刷できるため、コードで何が起こっているのかを理解するのに役立ちます。

于 2013-03-22T15:51:43.543 に答える