3

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

我在做:

# 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预期结果(无)。

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

4

3 回答 3

5

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

@list = grep defined, @list; 
于 2012-11-12T12:27:42.890 回答
4

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

您的grep行仅测试恰好等于一个空格的字符串。但是,该警告暗示至少有一个数组元素确实是undefined. 将未定义的值与 比较eq只会为空字符串产生 true,而不是单个空格。

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

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

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

于 2012-11-12T12:44:18.980 回答
2

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

@list = uniq grep { defined and /\S/ } @list;
于 2012-11-12T15:04:52.110 回答