6

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

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 条件?

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;

输出:

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

但是,为什么

你也可以这样做:

    ({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 回答