为什么这个错误?在join或string中使用未初始化的值

时间:2016-06-03 00:07:28

标签: linux perl shell

当我运行此脚本时:

SQL

然后我收到此错误:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @header = split ' ', <>;
my $last = q();
my @keep;
for my $i (0 .. $#header) {
    my ($prefix) = $header[$i] =~ /(.*)\./;
    if ($prefix eq $last) {
        push @keep, $i + 1;
    }
    $last = $prefix;
}
unshift @header, q();
say join "\t", @header[@keep];

while (<>) {
    my @columns = split;
    say join "\t", @columns[@keep];
}

你能指导我如何摆脱这个错误吗? 我应该改变数据文件吗?因为在小数据文件中运行此脚本时,我不会收到错误。但是当我运行它是我的真实数据文件时,我收到错误。

1 个答案:

答案 0 :(得分:3)

数组切片@columns[@keep]的至少一个元素是undef

您的文件末尾可能有一个空行。看一下输入文件的第3986行

我建议你改变你的最后一个循环,跳过不包含非空格字符的行

while (<>) {
    next unless /\S/;

    my @columns = split;

    if ( $keep[-1] > $#columns ) {
        warn "Malformed data at input file line $.\n";
        next;
    }

    say join "\t", @columns[@keep];
}