如何从perl中的数组中过滤掉空哈希?

时间:2012-09-28 07:33:29

标签: arrays perl hash grep

我有一系列像这样的哈希:

my @array = [
             {1 => "Test1"},
             {},
             {1 => "Test2"},
            ];

我尝试从这个数组中过滤出{},以便最终结果是一个没有任何{}的数组,如下所示:

my @array = [
             {1 => "Test1"},
             {1 => "Test2"},
            ];

我尝试使用类似的东西,但它不起作用:

my @new_array = grep(!/{}/, @array);

3 个答案:

答案 0 :(得分:8)

grep命令可以将正则表达式作为参数,但也可以是任意代码块。并且请不要尝试将Perl代码与正则表达式匹配,这不起作用。

相反,我们要求匿名哈希中的键数:

my @new_array = grep { keys %$_ } @array;

这将选择@array中密钥数不为零的所有哈希值。

答案 1 :(得分:6)

1)一个小小的修正:

my @array = [
    {1 => "Test1"},
    {},
    {1 => "Test2"},
];

实际上是一个包含数组引用的1元素数组。你可能需要

my @array = (
    {1 => "Test1"},
    {},
    {1 => "Test2"},
);

2)grep expr:

my @new_array = grep { scalar %$_ } @array;

如果标量为空,则哈希在标量上下文中返回0,否则返回“17/32”。所以grep只会选择非空数组。

更新:正如@ raina77ow建议的那样,标量可能会被省略!所以它甚至更短(尽管我仍然更喜欢明确的scalar以明确我的代码。)

my @new_array = grep { %$_ } @array;

答案 2 :(得分:0)

你需要这样的东西:

my @new_array = grep(keys %$_, @array);

代码中的/.../是正则表达式。它检查数组中的每个元素是否包含某些字符。但是,您的数组包含对哈希的引用,因此您需要取消引用每个元素,然后查看它是否为空。

此外,此声明不正确:

my @array = [
             {1 => "Test1"},
             {},
             {1 => "Test2"},
            ];

括号创建一个数组引用,而您只需要一个数组。只需使用括号:

my @array = (
             {1 => "Test1"},
             {},
             {1 => "Test2"},
            );