0

这是一个 perl 脚本,它采用制表符分隔的输出文件并输出三个不同的文本文件,也是制表符分隔的。SO 上的另一个用户帮助我纠正了一个错误,该错误在输出文件的每一行末尾创建了额外的空白。但是,我希望输出逗号分隔的文本。当我替换print $Afile join( ",", @ADD) , "\n";而不是 print $Afile join( "\t", @ADD) , "\n";在输出文件的每一行末尾得到两个尾随逗号时。这些是从哪里来的?

#!/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 回答