【问题标题】:Adding value to array if condition is fulfilled如果满足条件,则向数组添加值
【发布时间】:2012-05-12 00:26:01
【问题描述】:

我正在构建一个数组的哈希数组

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

有没有办法仅在满足条件时才添加第二个内部哈希? 像这样的:

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
    },
);

但它变得非常难以辨认,因为我必须在使用它们之前预定义所有内部数组,在某些情况下,这比用法要高出 100 行代码。

有什么方法可以直接在我插入数组元素的地方添加 if 条件?

【问题讨论】:

    标签: arrays perl if-statement perl-data-structures


    【解决方案1】:

    使用conditional operator,可以作为表达式使用。

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

    【讨论】:

    • “三元运算符”不是它的名字,它只是对它需要多少个操作数的描述。条件运算符不是 Perl 唯一的三元运算符。 (例如dbmopen)已修复。
    【解决方案2】:

    除了条件运算符(有时与它结合使用)之外,map 在类似情况下通常很有用。

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

    【讨论】:

      【解决方案3】:

      您在 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'} : () ) ,
            ]
          },
      ) ;
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        #!/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;
        

        输出:

        --- - 标签:第一个哈希 - 内部数组: - 标签:第一个内部哈希 标签:第二个哈希

        但是,为什么?

        你也可以这样做:

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

        但是,再次,为什么?

        具体来说,将其嵌入到数据结构的初始化中,可以在视觉上隐藏代码阅读者正在发生的事情。如果条件再复杂一点,势必会引入难以追踪的错误。

        【讨论】:

          猜你喜欢
          • 2020-10-31
          • 1970-01-01
          • 1970-01-01
          • 2021-10-15
          • 1970-01-01
          • 2014-06-16
          • 2016-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多