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"},
];

実際には、配列refが内部にある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;
于 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 に答える