2010-01-29 3 views
13

5.10 से पहले पर्ल में कोई "राज्य" घोषणा नहीं है।

मैं इन पर्ल्स में स्थिर चर बनाने के उदाहरण में आया हूं: my $x if 0if 0 सशर्त एक स्थिर चर की तरह चर कार्य करता है:

use strict; use warnings; 
add() for 1..7; 

sub add { 
    my @arr =() if 0; 

    push @arr, '+'; 
    print @arr, "\n"; 
} 

प्रिंट:

+ 
++ 
+++ 
++++ 
+++++ 
++++++ 
+++++++ 

इस व्यवहार पर्ल के सभी संस्करणों में लगातार 5.10 से पहले है?

+1

ठीक है, नहीं संस्करणों पर्ल 5.0 :) –

उत्तर

14

मैंने स्थिर चर बनाने के लिए हमेशा स्कोपिंग ब्रेसेस का उपयोग किया है।

add() for 1..2;  # Append to existing. 
add('foo', 'bar'); # Re-initialize if args are passed. 
add() for 1..2;  # Append to existing. 
{ 
    my @arr; 
    sub add { 
     @arr = @_ if @_; 
     push @arr, '+'; 
     print @arr, "\n"; 
    } 
} 
9

नहीं, यह बहुत क्रमी है। इसके बजाय एक बंद का उपयोग करें।

use strict; 

sub add { 
    my @arr; 

    return sub { 
     push @arr, '+'; 
     print @arr, "\n"; 
    } 
} 

my $iter = add(); 
$iter->() for 1..7; 
+1

कह रही है "नहीं" का तात्पर्य है कि चाल नहीं प्रयोग करने योग्य 5.10 से पहले, जबकि वास्तव में इस एक प्रयोग करने योग्य बग/सुविधा 5.10 उससे पहले है से पहले ठीक करने के लिए 'राज्य' कीवर्ड पेश किया गया था। –

15

my $x if 0 का व्यवहार एक बग है। यह लंबे समय तक जीवित रहा है क्योंकि यह उपयोगी है और इस प्रकार उपयोग किया जाता है; फिक्सिंग यह मौजूदा कोड तोड़ देगा। यह सुसंगत है और इसलिए उपयोग करने योग्य माना जा सकता है लेकिन इसका मतलब यह नहीं है कि आपको ऐसा करना चाहिए। इस "सुविधा" पदावनत किया गया है और 5.10 के रूप में एक चेतावनी जारी करता है:

Deprecated use of my() in false conditional 

भले ही आप state उपयोग नहीं कर सकते (यानी अपने कोड 5.10 से पहले पर्ल के संस्करणों के तहत चलाने के लिए सक्षम होने की जरूरत है) my $x if 0 चाल सिर्फ आलस्य है। अन्यथा एक बंद का उपयोग करें:

{ 
    my $x; 
    sub counter { 
     $x = '1' unless defined $x; 
     print $x++, "\n"; 
    } 
} 
+0

'मेरा $ x = 0 अगर undef; तो चेतावनी जारी नहीं करता है। –

संबंधित मुद्दे