0

以下は、タブ区切りの出力ファイルを受け取り、同じくタブ区切りの 3 つの異なるテキスト ファイルを出力する perl スクリプトです。SO の別のユーザーが、出力ファイルの各行の最後に余分な空白を作成する間違いを修正するのを手伝ってくれました。ただし、代わりにカンマ区切りのテキストを出力したいと考えています。print $Afile join( ",", @ADD) , "\n";代わり に置き換えるprint $Afile join( "\t", @ADD) , "\n";と、出力ファイルの各行の末尾に 2 つの末尾のコンマが表示されます。これらはどこから来たのですか?

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

die "usage: [ imputed genotype.file ]\n" unless @ARGV == 1;

open my $Afile, ">$imputed" . "_ADD.txt" or die $!;
open my $Dfile, ">$imputed" . "_DOM.txt" or die $!;
open my $Ifile, ">$imputed" . "_IMP.txt" or die $!;

<>; #skip header
while(<>){ 
  chomp;
  my @entries = split( '\t', $_ );

  my @ADD = ();
  my @DOM = ();
  my @IMP = ();

  push( @ADD, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);
  push( @DOM, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);
  push( @IMP, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);

  for ( my $i = 3; $i < scalar @entries - 1 ; $i+=3 ) { ### for each entry per line
      push( @ADD, $entries[ $i ] );
      push( @DOM, $entries[ $i + 1 ] );

  $entries[ $i + 2 ] =~ s/^NA$//; 

      push( @IMP, $entries[ $i + 2 ] );
  }

  print $Afile join( "\t", @ADD) , "\n"; 
  print $Dfile join( "\t", @DOM) , "\n"; 
  print $Ifile join( "\t", @IMP) , "\n"; 

} ### for loop   

close $Afile;
close $Dfile;
close $Ifile;
4

2 に答える 2

4

タブは空白文字であるため、現在のバージョンでは表示されませんが、すでに末尾のタブがあります。それらは、配列内の null 要素が原因です。ただし、grepでそれらをフィルタリングできます:

print $Afile join( ",", grep { $_ } @ADD) , "\n"; 
于 2012-12-22T06:42:25.340 に答える
0

ほとんど定義上、join末尾のコンマを導入するつもりはありません。配列の要素にカンマを挿入して文字列を作成します。しかし、配列の要素は、必ずしもあなたが考えているものとは限りません。提供するスニペットが次のような行を取得するとどうなるかを考えてみましょう:

A,B,C,D,E,NA

行は、の$entries[$i+2] =~ s/^NA$//;よう@IMPに見えることを意味します。これは、それがなり、末尾のコンマが('A', 'B', 'C', '')あることを意味します。join(",", @IMP)"A,B,C,,"

また、入力内容が適切に構成されていない可能性もあります。のような行は、いくつかの配列に値A,B,C,Dを残しますが、その場合、大量のエラーが表示されることを意味します。undefstrictwarnings

于 2012-12-22T07:10:50.197 に答える