【问题标题】:why this error? Use of uninitialized value in join or string at为什么这个错误?在连接或字符串中使用未初始化的值
【发布时间】:2016-06-03 00:07:28
【问题描述】:

当我运行这个脚本时:

#!/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];
}

然后我得到这个错误:

Use of uninitialized value in join or string at./first.perl line 21, <> line 3986. 

你能指导我如何摆脱这个错误吗? 我应该改变一些可能的数据文件吗?因为当在一个小数据文件中运行这个脚本时,我没有得到错误。但是当我运行它是我的真实数据文件时,我得到了错误。

【问题讨论】:

    标签: linux perl shell


    【解决方案1】:

    数组切片@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];
    }
    

    【讨论】:

    • 我按照你说的做了,我又得到了和以前一样的错误;在 ./firstt.perl 第 22 行, 第 3986 行的连接或字符串中未初始化的值。在 ./firstt.perl 第 22 行, 第 3986 行的连接或字符串中使用未初始化的值。您还有其他建议吗?跨度>
    • @zara - 为了强调 Borodin 的诊断,问题出在数据文件的第 3986 行。如果建议的代码更改未解决警告,则该行不能完全空白,但显然不包含 @keep 中的任何字段的数据。
    • @zara:请确认您的问题已经解决。您必须查看数据文件的第 3986 行才能发现问题。如果您需要进一步的帮助,那么您应该提出一个新问题
    • @zara:当您的问题解决后,请不要走开。 您的问题的解决方案主要是有用的,因此它可以帮助其他有类似问题的人。 既然您说过我的代码只是跳过空行并没有帮助您总之,请详细说明到底出了什么问题以及如何解决
    • @Borodin 谢谢你的解释。正如您在回答中解释的那样,我的数据文件的最后一行中有一些空白点。事实上,最后一行的一半是空的。但是当我正确创建我的数据文件时,黑点就消失了,我的问题就解决了。但只要最后一行中存在空白点,您的解决方案就没有用。
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多