如果满足条件,则向数组添加值

时间:2012-05-02 13:59:00

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

我正在构建数组哈希数组

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

但是它变得非常难以辨认,因为我必须在使用它们之前预先定义所有内部数组,在某些情况下,这些数组在使用之上是几百行代码。

有没有办法直接在插入数组元素的地方添加if条件?

4 个答案:

答案 0 :(得分:9)

使用conditional operator,它可用作表达式。

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

答案 1 :(得分: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'} : () ) ,
      ]
    },
) ;

答案 2 :(得分: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;

输出:

---
- label: first hash
- innerarray:
    - label: first inner hash
  label: second hash

但是,为什么

你也可以这样做:

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

但是,为什么

具体而言,将其嵌入到数据结构的初始化中,可以直观地隐藏代码阅读器中发生的事情。如果条件甚至有点复杂,那么您必然会引入难以追踪的错误。

答案 3 :(得分:3)

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

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

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