2012-05-02 9 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 
    }, 
); 

लेकिन यह बहुत अस्पष्ट हो जाता है, के रूप में मैं उन्हें प्रयोग करने से पहले सभी आंतरिक सरणी पूर्वपरिभाषित करने, जो कुछ मामलों में उपयोग के ऊपर कोड की कई 100 लाइनें हैं।

क्या if-condition को सीधे जोड़ने के लिए कोई तरीका है जहां मैं सरणी तत्व डालता हूं?

उत्तर

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

"टर्नरी ऑपरेटर" इसका नाम नहीं है, यह सिर्फ एक विवरण है कि यह कितने ऑपरेंड लेता है। सशर्त ऑपरेटर पर्ल का एकमात्र टर्नरी ऑपरेटर नहीं है। (उदाहरण के लिए 'डीबीएमओपेन') फिक्स्ड। – 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

+0

@Pit मैं अपने जवाब अद्यतन का समाधान नहीं होता। यह पर एक नज़र डालें। – 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), 
     ] 
    }, 
);