Хотелось бы понять, как более рациональней, чем представлено ниже в примере, передать сложную структуру данных между процессами perl?
В примере я кодировал структуру perl-данных при помощи модуля Storable и далее преобразовывал все это дело посредством join( '_', unpack( "C*", ) ) в строку, состоящую из кодов ASCII, разделенных символом "_". Все это дело, конечно, работает, но получается, что в трубе по факту гоняется больше чем нужно данных (в 3-4 раза).
#!/usr/bin/perluse strict;
use warnings;use Storable;
use IO::Pipe;
use IO::Handle;
use Data::Dumper;# создаем трубу
my $pipe = IO::Pipe->new();# делаем fork
my $pid = fork();# дочка
if( $pid == 0 ) {
# тут мы пишем в трубу
$pipe->writer();
$pipe->autoflush( 1 );foreach( 1..10 ) {
# создаем ссылку на хэш
my $data = { pid => $$, data => $_ };# пересылаем в трубу закодированный в строку хэш
print $pipe join( '_', unpack( "C*", Storable::freeze( $data ) ) ) . "\n";# sleep на 0.3 секунды
select undef, undef, undef, 0.3;
}
}# родитель
else {
unless( defined $pid ) {
die 'Cannot fork';
}# тут мы читаем из трубы
$pipe->reader();while( <$pipe> ) {
# преобразуем строку в данные
my $data = Storable::thaw( pack( "C*", split( '_', $_ ) ) );# выводим то, что пришло от дочки
print Dumper $data;
}
}
#!/usr/bin/perl
use strict;
use warnings;use Storable qw(store_fd fd_retrieve);
use IO::Pipe;
use IO::Handle;
use Data::Dumper;# создаем трубу
my $pipe = IO::Pipe->new();# делаем fork
my $pid = fork();# дочка
if( $pid == 0 ) {
# тут мы пишем в трубу
$pipe->writer();
$pipe->autoflush( 1 );foreach( 1..10 ) {
# создаем ссылку на хэш
my $data = { pid => $$, data => $_ };# пересылаем в трубу закодированный в строку хэш
store_fd $data, $pipe;# sleep на 0.3 секунды
select undef, undef, undef, 0.3;
}
}# родитель
else {
unless( defined $pid ) {
die 'Cannot fork';
}# тут мы читаем из трубы
$pipe->reader();until ( eof $pipe ) {
my $data = fd_retrieve($pipe);# выводим то, что пришло от дочки
print Dumper $data;
}
}
>use Storable qw(store_fd fd_retrieve);
> store_fd $data, $pipe;
> until ( eof $pipe ) {
> my $data = fd_retrieve($pipe);Спасибо! Сам почему-то не увидел в доке этого...