2011-09-07 13 views
9

वास्तव में पर्ल को नहीं जानते, मैं एक दोस्ताना खोज इंजन से सहायता के साथ एक पर्ल स्क्रिप्ट को बढ़ा रहा हूं।क्या इस पर्ल लूप से सशर्त रूप से 'आखिरी' के लिए एक क्लीनर तरीका है?

मुझे लगता है कि मैं एक लूप से बाहर तोड़ने के लिए, जबकि एक ध्वज की स्थापना करता है, तो एक शर्त सच हो रहा है की जरूरत है:

:

foreach my $element (@array) { 
    if($costlyCondition) { 
     $flag = 1; 
     last; 
    } 
} 

मुझे पता है कि 'अंतिम' का उपयोग करने के अच्छे तरह से कुछ इस तरह है

foreach my $element (@array) { 
    last if ($costlyCondition); 
} 

बेशक, इसका मतलब है कि जब मैं सिंटैक्टिक चीनी का आनंद ले सकता हूं, तो मैं अपने ध्वज को लूप के अंदर सेट नहीं कर सकता, जिसका मतलब है कि मुझे एक बार फिर $costlyCondition का मूल्यांकन करने की आवश्यकता है।

क्या ऐसा करने का कोई क्लीनर तरीका है?

+6

पोस्टफिक्स 'if' वास्तव में केवल एक कथन के लिए है। आपका पहला एक सशर्त पर एकाधिक बयानों के लिए बेहतर है। –

+0

मुझे लगता है कि अगर इस मामले में एक ब्लॉक बेहतर विकल्प है। लूप नियंत्रण पर पोस्टफिक्स सशर्त के लिए सामान्य तर्क यह है कि यह बाईं ओर अधिक महत्वपूर्ण कोड रखता है। इस बात पर जोर देते हुए कि लूप के पास बाहर निकलने की स्थितियों के बारे में कई निकास स्थितियां हैं। इस मामले में यदि आप कुछ यौगिक अभिव्यक्तियों का उपयोग करते हैं तो सुझाव दिया गया है कि परिणाम केवल अभिव्यक्ति में लूप नियंत्रण को गहरा कर देता है जिससे एक नज़र में देखना मुश्किल हो जाता है। –

+0

@ जोएल: आप सही हैं। मैं मूल संस्करण के साथ रहना। – ArjunShankar

उत्तर

21

आप एक do {...} ब्लॉक का उपयोग कर सकते हैं: तार्किक साथ आप भी ऐसा कर सकते

$flag = 1, last if $costlyCondition; 

:

do {$flag = 1; last} if $costlyCondition 

आप , ऑपरेटर का उपयोग कर सकते बयान शामिल होने के लिए && ऑपरेटर:

(($flag = 1) && last) if $costlyCondition; 

या यहां तक ​​कि कम प्राथमिकता and:

(($flag = 1) and last) if $costlyCondition; 

दिन के अंत में

, वहाँ इनमें से किसी भी करने के लिए कोई वास्तविक कारण नहीं है। वे सभी आपके मूल कोड के समान ही करते हैं। यदि आपका मूल कोड काम करता है और सुगम है, तो इसे छोड़ दें।

+0

'$ ध्वज = 1 जोड़ें और अंतिम अगर $ महंगा कंडीशन; 'अपने टूल-शेल्फ में जोड़ें। –

+0

अपने दूसरे उदाहरण में, {} को छोड़ दें। उनकी जरूरत नहीं है। – ysth

+0

मैं एक नया पर्ल निर्माण नहीं सीखता! (कर)। धन्यवाद! और आप की तरह और लगभग सभी ने कहा, कोड को रखना सबसे अच्छा है। – ArjunShankar

5

एक विचार एक सबराउटिन में लूप करना है जो निकास बिंदु के आधार पर अलग-अलग मान देता है।

my $flag = check_elements(\@array); 

# later... 

sub check_elements { 
    my $arrayref = shift; 
    for my $ele (@$arrayref) { 
    return 1 if $costly_condition; 
    } 
    return 0; 
} 
7

मैं नाथन से सहमत हूं कि साफ दिखने वाला कोड साफ है, कभी-कभी एक पठनीय संस्करण बेहतर होता है।

last if $flag = $costly_condition; 

नोट समानता == के बजाय काम = के उपयोग: बस इसके बारे में नरक के लिए, हालांकि, यहां एक भयानक संस्करण है। असाइनमेंट $costly_condition में जो भी मान वापस करेगा, वह वापस करेगा।

यह निश्चित रूप से $flag = 1 नहीं बनाएगा, लेकिन जो भी $costly_condition है। लेकिन, चूंकि इसे सत्य होने की आवश्यकता है, इसलिए $flag होगा। कि सुधार करने के लिए, आप कर सकते हैं - जायद में टिप्पणी के रूप में उल्लेख किया है - उपयोग:

last if $flag = !! $costly_condition; 

के रूप में उल्लेख किया है, बहुत भयानक समाधान है, लेकिन वे काम करते हैं।

+4

'आखिरी अगर $ ध्वज = !! $ costly_condition; 'चाल करेगा;) – Zaid

+0

@zaid हे, हाँ, मैंने उसे भी देखा। – TLP

+0

इसे और भी खराब बनाने के लिए: 'आखिरी बार $ ध्वज =! $ costly_condition';) – pavel

0

यह संभव है, लेकिन अत्यधिक अनुशंसित नहीं है: ऐसी चालें आपके कोड की पठनीयता कम करती हैं।

foreach my $element (@array) { 
    $flag = 1 and last if $costlyCondition; 
} 
संबंधित मुद्दे