[英]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.