这是一个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;
答案 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
个值,但strict
和warnings
意味着在这种情况下你会看到一堆错误。< / p>