perl

2012-05-31 21 views
10

में डबल घुंघराले ब्रेसिज़ मैं ऑनलाइन परल कोड देख रहा था और कुछ ऐसा हुआ जो मैंने पहले नहीं देखा था और यह नहीं पता कि यह क्या कर रहा है (यदि कुछ भी हो)।perl

if($var) {{ 
    ... 
}} 

क्या किसी को पता है कि डबल घुंघराले ब्रेसिज़ का क्या मतलब है?

+5

मुझे नहीं लगता कि वे कुछ भी करते हैं। मुझे लगता है कि अगर वे ब्लॉक में कोड का एक और ब्लॉक जोड़ने के बराबर हैं। – gpojd

उत्तर

11

यह आमतौर पर do के साथ नियोजित एक चाल है, chapter Statement Modifiers in perlsyn देखें।

शायद लेखक next या इसी तरह के ब्लॉक से बाहर निकलना चाहता था।

+0

ऐसा प्रतीत होता है कोड क्या कर रहा है अंतिम कीवर्ड कोड में कोड में प्रयोग किया जाता है। धन्यवाद! हैश कन्स्ट्रक्टर की संभावना का उल्लेख करने के लिए – Chris

4

if के मामले में, वे शायद ही ब्रेसिज़ के बराबर हैं (लेकिन यह cf.

perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2' 

क्या ब्लॉक के अंदर है पर और if बाहर निर्भर करता है,)। हालांकि, next या do के साथ, डबल ब्रेसिज़ का उपयोग करने के कारण हैं, perlsyn देखें। उदाहरण के लिए, इसे कई बार चलाने का प्रयास करें:

perl -E 'if (1) {{ say $c++; redo if int rand 2 }}' 

और एकल ब्रेसिज़ को एकल के साथ बदलने का प्रयास करें।

+0

यह एक अच्छा उदाहरण है। – ysth

0

अधिक कोड के बिना, यह कहना मुश्किल है कि उनका क्या उपयोग किया जा रहा है। यह एक टाइपो हो सकता है, या यह एक नग्न ब्लॉक हो सकता है, chapter 10.4 The Naked Block Control Structure in Learning Perl देखें।

एक नग्न ब्लॉक ब्लॉक के भीतर चर के लिए अक्षीय स्कॉपिंग जोड़ता है।

+0

'if' पहले से ही उस स्कोपिंग प्रदान करने के बाद ब्रेसिज़ का पहला सेट नहीं है? घोंसला क्यों? मैं काफी हद तक perl से अनजान हूँ, तो शायद यह लोगों के लिए स्पष्ट है, लेकिन मेरे लिए नहीं! –

+2

@ChrisFarmer: क्योंकि 'if (1) {{my $ x = 1; } {मेरा $ x = 2; }} ' – choroba

+0

दूसरा दायरा जोड़कर, आप' $ var' को फिर से सौंप सकते हैं और नग्न ब्लॉक में इसका उपयोग ऐसे तरीके से कर सकते हैं जो ब्लॉक के बाहर दिखाई नहीं दे रहा है। –

14

वहां दो कथन हैं। एक "अगर" कथन और bare block। दुर्लभ ब्लॉक लूप होते हैं जिन्हें एक बार निष्पादित किया जाता है।

say "a"; 
{ 
    say "b"; 
} 
say "c"; 

# Outputs a b c 

लेकिन छोरों जा रहा है, वे को प्रभावित करते हैं next, last और redo

my $i = 0; 
say "a"; 
LOOP: { # Purely descriptive (and thus optional) label. 
    ++$i; 
    say "b"; 
    redo if $i == 1; 
    say "c"; 
    last if $i == 2; 
    say "d"; 
} 
say "e"; 

# Outputs a b b c e 

(nextlast के रूप में ही करता है के बाद से वहाँ कोई अगले तत्व है।)

वे आम तौर पर एक शाब्दिक गुंजाइश बनाने के लिए इस्तेमाल कर रहे हैं।

my $file; 
{ 
    local $/; 
    open(my $fh, '<', $qfn) or die; 
    $file = <$fh>; 
} 
# At this point, 
# - $fh is cleared, 
# - $fh is no longer visible, 
# - the file handle is closed, and 
# - $/ is restored. 

यह स्पष्ट नहीं है कि यहां क्यों इस्तेमाल किया गया था।


वैकल्पिक रूप से, यह एक हैश कन्स्ट्रक्टर भी हो सकता है।

sub f { 
    ... 
    if (@errors) { 
     { status => 'error', errors => \@errors } 
    } else { 
     { status => 'ok' } 
    } 
} 

के लिए

sub f { 
    ... 
    if (@errors) { 
     return { status => 'error', errors => \@errors }; 
    } else { 
     return { status => 'ok' }; 
    } 
} 

कम पर्ल ब्रेसिज़ में peeks अगर यह एक नंगे पाश या एक हैश निर्माता यह अनुमान लगाने का है। चूंकि आपने ब्रेसिज़ की सामग्री प्रदान नहीं की है, इसलिए हम नहीं बता सकते हैं।

+1

+1। – chepner

0

{{ब्लॉक के "" से बाहर निकलने के लिए उपयोग किया जा सकता है।मेरे पास कुछ कोड है जिसमें शामिल हैं:

if ($entry =~ m{\nuid: ([^\s]+)}) {{ # double brace so "last" will break out of "if" 
    my $uid = $1; 
    last if exists $special_case{$uid}; 
    # .... 

}} 
# last breaks to here