为什么我似乎无法从Perl中的数组中删除未定义的元素?

时间:2012-11-12 12:24:26

标签: arrays perl list

我有一个来自哈希表中数据的字符串数组。我试图删除任何(显然)空元素,但由于某种原因似乎有一个顽固的元素拒绝去。

我在做:

# Get list array from hash first, then
@list = grep { $_ ne ' ' } @list; 
@list = uniq @list;
return sort @list;

grep行,我收到Use of uninitialized value in string ne...消息,下面正确打印了阵列的其余部分。

我尝试过“漫长”的方式:

foreach (@list) {
    if ($_ ne ' ') {
        push @new_list, $_;
    }
}

但这会产生完全相同的结果。我尝试使用defined和预期结果(没有)。

我可以预先对数组进行排序并删除第一个元素,但这似乎非常危险,因为我不能保证数据集总是有空白元素。诉诸正则表达似乎也过分,但也许我错了。我确定我像往常一样,错过了一些非常简单的事情。

3 个答案:

答案 0 :(得分:4)

元素不能为空。您正在尝试删除 undefined 元素。但是你没有检查元素是否未定义,你正在检查它是否由一个由单个空格组成的字符串组成。你想要:

@list = grep defined, @list; 

答案 1 :(得分:4)

我的回答是假设您不希望字符串为空(表示未定义或长度为0)或仅包含空格。

您的grep行仅测试与一个空格完全相同的字符串。但是,警告意味着至少有一个数组元素确实是undefined。将未定义的值与eq进行比较只会对空字符串产生true,而不是单个空格。

因此,为了删除所有未定义的条目或仅包含空格的条目,您可以执行以下操作:

@list = grep { defined && m/[^\s]/ } @list;

请注意,Perl的空格是真实的。因此,简单的grep defined, @list实际上不会丢弃仅由空格组成的条目。

答案 2 :(得分:2)

看起来您想要过滤包含非空格字符的所有元素。要做到这一点以及拒绝未定义的元素,您只需编写

即可
@list = uniq grep { defined and /\S/ } @list;