2010-10-02 12 views
6

मुझे लगता है कि यह सबसे अच्छा एक उदाहरण का उपयोग करते हुए कहा जा सकता है:मैं पर्ल में बंद होने का क्रमबद्ध कैसे कर सकता हूं?

use strict; 
use warnings; 
use 5.010; 
use Storable qw(nstore retrieve); 

local $Storable::Deparse = 1; 
local $Storable::Eval = 1; 

sub sub_generator { 
    my ($x) = @_; 

    return sub { 
     my ($y) = @_; 
     return $x + $y; 
    }; 
} 

my $sub = sub_generator(1000); 
say $sub->(1); # gives 1001 
nstore($sub, "/tmp/sub.store"); 
$sub = retrieve("/tmp/sub.store"); 
say $sub->(1); # gives 1 

जब मैं /tmp/sub.store डंप मैं देख रहा हूँ:

$VAR1 = sub { 
      package Storable; 
      use warnings; 
      use strict 'refs'; 
      my($y) = @_; 
      return $x + $y; 
     } 

लेकिन $x इस उप में कभी नहीं परिभाषित किया गया है। मैं उम्मीद करता हूं कि sub_generator द्वारा उत्पन्न उपको पीढ़ी पर इसके वास्तविक मूल्य के साथ बदल दिया जाएगा। मुझे इसे कैसे हल करना चाहिए?

नोट यह प्रश्न इस one से संबंधित है।

+0

शायद यह वापस कदम उठाने और विचार करने का समय है कि serializing subs एक अच्छा विचार है या नहीं? मुझे अपने करियर में ऐसी चीज करने की ज़रूरत नहीं है। – Ether

+0

@ अन्य मैंने इसके बजाय किसी ऑब्जेक्ट का उपयोग करने के लिए सुझाव अपनाया। कुछ कारणों से मैं पर्ल में वस्तुओं से बचने के लिए उत्सुक था, जब तक कि आप लोगों ने मुझे मूस से पेश नहीं किया, जो सबकुछ बहुत अच्छा बनाता है। –

उत्तर

5

दुर्भाग्य से मुझे नहीं लगता कि Storable बंद होने के साथ काम करता है। हालांकि अन्य सीपीएएन मॉड्यूल हैं जो एक बंद करने का क्रमबद्ध करेंगे। उदाहरण के लिए। Data::Dump::Streamer

use 5.012; 
use warnings; 
use Data::Dump::Streamer; 

sub sub_generator { 
    my ($x) = @_; 

    return sub { 
     my ($y) = @_; 
     return $x + $y; 
    }; 
} 

my $sub = sub_generator(1000); 
say $sub->(1); # gives 1001 

my $serialised = Dump($sub)->Out; 
my $copy = do { 
    my $CODE1 = undef; 
    eval $serialised; 
    $CODE1; 
}; 

say $copy->(2); # gives 1002 
say $sub->(1); # still gives 1001 

इस धारावाहिक कोड जब यहाँ मुद्रित, say Dump $sub; कैसा दिखता है:

my ($x); 
$x = 1000; 
$CODE1 = sub { 
      use warnings; 
      use strict 'refs'; 
      BEGIN { 
      $^H{'feature_unicode'} = q(1); 
      $^H{'feature_say'} = q(1); 
      $^H{'feature_state'} = q(1); 
      $^H{'feature_switch'} = q(1); 
      } 
      my($y) = @_; 
      return $x + $y; 
     }; 


अद्यतन

Perl5 पर इस सूत्र Storable and Closures मेलिंग सूची कुलियों देखें। यह पुष्टि करता है कि मैंने Storable और बंद होने के बारे में क्या सोचा था।

/I3az/

+0

मैं क्या गलत कर रहा हूँ? मुझे एक खाली फ़ाइल मिलती है: 'डेटा :: डंप :: स्ट्रीमर का उपयोग करें; मेरा $ एच = {ए => 1, बी => 2}; खुला (मेरा $ एफएच, ">", "/ टीएमपी/डीएल"); डंप ($ एच) -> करने के लिए ($ एफएच) या मर; बंद करें ($ एफएच); ' –

+0

' डंप ($ एच) -> से ($ एफएच) -> आउट 'चाल करेगा। – draegtun

+0

धन्यवाद धन्यवाद। –

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