尾随逗号来自哪里(perl)

时间:2012-12-22 06:33:03

标签: perl parsing csv text-files comma

这是一个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;

2 个答案:

答案 0 :(得分:4)

由于标签是空白字符,因此您不会在当前版本中看到它们,但您已经有了尾随标签。它们归因于数组中的null元素。您可以使用grep过滤它们:

print $Afile join( ",", grep { $_ } @ADD) , "\n"; 

答案 1 :(得分: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这样的行会在几个数组上留下undef个值,但strictwarnings意味着在这种情况下你会看到一堆错误。< / p>