[英]How do I filter out empty hashes from an array in perl?
我有一系列的哈希像这样:
my @array = [
{1 => "Test1"},
{},
{1 => "Test2"},
];
我尝试从这个数组中过滤出{},以便最终结果是一个没有任何{}的数组,如下所示:
my @array = [
{1 => "Test1"},
{1 => "Test2"},
];
我尝试使用这样的东西,但它不起作用:
my @new_array = grep(!/{}/, @array);
grep
命令可以将正则表达式作为参数,但也可以是任意代码块。 并且请不要尝试将Perl代码与正则表达式匹配,这不起作用。
相反,我们要求匿名哈希中的键数:
my @new_array = grep { keys %$_ } @array;
这将选择@array
中的所有哈希值,其中键的数量不为零。
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;
你需要这样的东西:
my @new_array = grep(keys %$_, @array);
代码中的/.../
是一个正则表达式。 它检查数组中的每个元素是否包含某些字符。 但是,您的数组包含对哈希的引用,因此您需要取消引用每个元素,然后查看它是否为空。
此外,此声明不正确:
my @array = [
{1 => "Test1"},
{},
{1 => "Test2"},
];
括号创建一个数组引用,而您只需要一个数组。 只需使用括号:
my @array = (
{1 => "Test1"},
{},
{1 => "Test2"},
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.