【问题标题】:Why can't I seem to remove undefined element from an array in Perl?为什么我似乎无法从 Perl 的数组中删除未定义的元素?
【发布时间】:2012-11-12 12:24:25
【问题描述】:

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

我在做:

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

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

【问题讨论】:

  • 我应该补充一点,空白元素实际上是一个空格。这就是我测试它的原因

标签: arrays perl list


【解决方案1】:

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

@list = grep defined, @list; 

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 您能解释一下!m/$\s+$/ 部分吗?每次迭代我都会得到一个Use of uninitialized value in concatenation (.) or string...。谢谢!
    • 其实我犯了两个错误。对此感到抱歉。我已经纠正了他们。第一个 $_ 匹配所有已定义且不为空的内容。第二部分是修正后的正则表达式m/^\s+$/。这意味着:^ 从字符串的开头匹配,\s+ 一个或多个空格(空格和制表符),$ 直到字符串的结尾。这意味着所有仅由空格组成的字符串也将被跳过。
    • /\S/!m/^\s+$/ 简单。
    • /\w/ 检查任何有意义的事情 ([0-9a-zA-Z_])
    • 这也将删除单个 0 字符的元素。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多