2010-10-02 8 views
6

Tôi nghĩ rằng điều này có thể được yêu cầu tốt nhất sử dụng một ví dụ:Làm thế nào tôi có thể tuần tự hóa một đóng cửa trong Perl?

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 

Khi tôi đổ /tmp/sub.store tôi thấy:

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

Nhưng $x không bao giờ được quy định tại phụ này. Tôi hy vọng rằng phụ được tạo bởi sub_generator sẽ có $x được thay thế bằng giá trị thực tế của nó khi tạo. Làm thế nào tôi nên giải quyết điều này?

Lưu ý câu hỏi này liên quan đến điều này one.

+0

Có lẽ đã đến lúc phải quay lại và cân nhắc xem việc sắp xếp tuần tự hóa phụ có phải là một ý tưởng hay không? Tôi hiếm khi gặp phải sự cần thiết phải làm một việc như vậy trong sự nghiệp của mình. – Ether

+0

@Tôi đã sử dụng đề xuất này để sử dụng đối tượng thay thế. Vì một lý do nào đó, tôi có xu hướng tránh các vật thể trong Perl, cho đến khi các bạn giới thiệu tôi với Moose, điều đó khiến mọi thứ trở nên đẹp hơn. –

Trả lời

5

Rất tiếc, tôi không nghĩ rằng Storable hoạt động với các bao đóng. Tuy nhiên có các mô-đun CPAN khác sẽ nối tiếp một đóng. Ví dụ: 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 

Đây là những gì mã serialized trông giống như khi in ở đây, 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; 
     }; 


Cập nhật

Xem chủ đề này Storable and Closures trên Perl5 khuân vác danh sách gửi thư. Nó xác nhận những gì tôi nghĩ về Storable và đóng cửa.

/I3az/

+0

Tôi đang làm gì sai? Tôi nhận được một tập tin rỗng: 'sử dụng dữ liệu :: Dump :: Streamer; my $ h = {A => 1, B => 2}; mở (my $ fh, ">", "/ tmp/DEL"); Dump ($ h) -> To ($ fh) hoặc chết; close ($ fh); ' –

+0

' Dump ($ h) -> To ($ fh) -> Out' sẽ thực hiện thủ thuật. – draegtun

+0

Cảm ơn bạn đã thoát. –