簡體   English   中英

如何從perl中的數組中過濾掉空哈希?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM