我有一个来自哈希表中数据的字符串数组。我试图删除任何(显然)空元素,但由于某种原因似乎有一个顽固的元素拒绝去。
我在做:
# 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
和预期结果(没有)。
我可以预先对数组进行排序并删除第一个元素,但这似乎非常危险,因为我不能保证数据集总是有空白元素。诉诸正则表达似乎也过分,但也许我错了。我确定我像往常一样,错过了一些非常简单的事情。
答案 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;