我正在构建数组哈希数组
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条件?
答案 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 ),
]
},
);