我有一系列像这样的哈希:
my @array = [
{1 => "Test1"},
{},
{1 => "Test2"},
];
我尝试从这个数组中过滤出{},以便最终结果是一个没有任何{}的数组,如下所示:
my @array = [
{1 => "Test1"},
{1 => "Test2"},
];
我尝试使用类似的东西,但它不起作用:
my @new_array = grep(!/{}/, @array);
答案 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"},
);