我有一个制表符分隔文件,如下所示:
__DATA__
0 0 1 0 1 ...
1 1 0 0 0 ...
1 0 0 0 0 ...
0 1 1 1 1 ...
列数和行数未指定。列可以是5 - 20 +。
目前,我一直在寻找文件,并按" \ t"分割线条。
下面只是所需代码的一部分,请注意,我使用strict和-w,并声明所有变量。
open(IN, "../../Desktop/$out") or die "Could not open $out";
my @sums;
while (<IN>) {
if ($_ =~ /([[01]\t]*)/) {
my @fields = split /\t/, $1;
foreach my $i (0..$#fields) {
$sums[$i] += $fields[$i];
}
}
}
print join("\n", @sums), "\n";
如果你能想出一个更好的理想方法,我很乐意尝试。 当我跑步时,我想出来:
__OUTPUT__
0
1
1
当我想要的是每个列的总数时,以可打印的格式的总和加到每列的底部。我以前没有使用过split函数,所以解释如何正确使用它,并访问它产生的数组(?)数组会很棒。谢谢!
__WantedOutput__
2 2 2 1 2 ...
每列的总数。
答案 0 :(得分:3)
你快到了。为了让@sums在循环中存活,你必须在它开始之前声明它。如果您希望输出在一行上,请不要使用换行符加入,但使用标签:
#!/usr/bin/perl
use warnings;
use strict;
my @sums;
while (<DATA>) {
if (/^[01] (?: \t [01] )+ $/x) {
my @fields = split;
for my $i (0 .. $#fields) {
$sums[$i] += $fields[$i];
}
}
}
print join("\t", @sums), "\n";
__DATA__
0 0 1 0 1
1 1 0 0 0
1 0 0 0 0
0 1 1 1 1