2012-05-02 62 views
5

我建立陣列的散列的數組增加值數組,如果條件fullfilled

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

有沒有辦法只能添加第二個內部哈希只有在條件fullfilled? 事情是這樣的:

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

我試着使用推重寫我的代碼:

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條件插入數組元素?

回答

8

使用conditional operator,它可用作表達。

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

謝謝,工作究竟如何我 – Pit

+1

「三元運算符」不是它的名字,它只是描述了它需要多少個操作數。條件運算符不是Perl唯一的三元運算符(例如'dbmopen')。 – ikegami

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

你是對的,但它並沒有解決@Pit我更新我的回答我最初的問題:( – Pit

+0

。看一看吧。 – dgw

+1

是的,相同的解決方案@daxim – Pit

2

你可以這樣做:

#!/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), 

但同樣,爲什麼

具體而言,將其嵌入數據結構的初始化中,可以直觀地隱藏代碼讀者發生的事情。如果條件甚至有點複雜,你一定會很難追查錯誤。

2

除了條件運算符(有時與它結合)之外,map在類似情況下通常也很有用。

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

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