2

我有一个像这样的哈希数组:

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

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

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

我尝试使用这样的东西,但它不起作用:

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

3 回答 3

8

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

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

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

@array这将选择键数不为零的所有散列。

于 2012-09-28T07:40:15.823 回答
6

1)小修正:

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

实际上是一个 1 元素数组,里面有数组 ref。你可能需要

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

2) grep 表达式:

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

如果 Hash 为空,则在标量上下文中返回 0,否则返回类似于 "17/32" 的值。所以grep只会选择非空数组。

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

my @new_array = grep { %$_ } @array;
于 2012-09-28T07:41:38.797 回答
0

你需要这样的东西:

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

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

此外,此声明不正确:

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

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

my @array = (
             {1 => "Test1"},
             {},
             {1 => "Test2"},
            );
于 2012-09-28T07:36:47.113 回答