6

配列のハッシュの配列を構築しています

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => [
        {label => 'first inner hash'},
        {label => 'second inner hash'},
      ]
    },
);

条件が満たされた場合にのみ2番目の内部ハッシュを追加する方法はありますか?このようなもの:

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => [
        {label => 'first inner hash'},
        {label => 'second inner hash'} if 1==1,
      ]
    },
);

pushを使用してコードを書き直そうとしました:

my @innerarray = ();
push @innerarray, {label => 'first inner hash'};
push @innerarray, {label => 'second inner hash'} if 1==1;

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => \@innerarray
    },
);

ただし、使用する前にすべての内部配列を事前に定義する必要があるため、非常に判読できなくなります。場合によっては、使用量よりも数百行多いコードになります。

array-elementを挿入する場所にif-conditionを直接追加する方法はありますか?

4

4 に答える 4

9

条件演算子を使用すると、式として使用できます。

my @array = (
    {label => 'first hash'},
    {
        label      => 'second hash',
        innerarray => [
            {label => 'first inner hash'},
            (1 == 1)
                ? {label => 'second inner hash'}
                : (),
        ]
    },
);
于 2012-05-02T14:09:45.753 に答える
6

配列参照をinnerarray(例1)に格納していますが、リライトでは配列を格納しようとしています。
代わりにこれを試してください:

my @innerarray = () ;
push @innerarray, {label => 'first inner hash'};
push @innerarray, {label => 'second inner hash'} if 1==1; # Not a real condition ...

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => \@innerarray
    },
) ;

そして、あなたも;二度行方不明でした。

そして、いくつかのコンテンツのインライン化に関するあなたの質問のために...

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => [
        {label => 'first inner hash'},
        ( $condition == 1 ? {label => 'second inner hash'} : () ) ,
      ]
    },
) ;
于 2012-05-02T14:06:03.063 に答える
3

できるよ:

#!/usr/bin/env perl

use strict; use warnings;

my @array = (
    {label => 'first hash'},
    {label => 'second hash',
     innerarray => [
        {label => 'first inner hash'},
        1 == 0 ? {label => 'second inner hash'} : (),
      ]
    },
);

use YAML;
print Dump \@array;

出力:

---
-ラベル:最初のハッシュ
--innerarray:
    -ラベル:最初の内部ハッシュ
  ラベル:2番目のハッシュ

しかし、なぜですか?

次のこともできます。

    ({label => 'second inner hash'}) x (1 == 0),

しかし、繰り返しますが、なぜですか?

具体的には、これをデータ構造の初期化に埋め込むと、コードのリーダーから何が起こっているかが視覚的に隠されます。条件が少しでも複雑な場合は、追跡が難しいエラーが発生する可能性があります。

于 2012-05-02T14:10:44.400 に答える
3

条件演算子に加えて(場合によってはそれと組み合わせて)、map同様の状況で役立つことがよくあります。

my @labels = (
    'first inner hash',
    'second inner hash',
);

my @array = (
    {label => 'first hash'},
    {
        label      => 'second hash',
        innerarray => [
            ( map { { label => $_ } } @labels ),
        ]
    },
);
于 2012-05-02T15:53:11.320 に答える