Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Передача Hash через STDIN


Автор: shamber 26.8.2008, 16:37
Здравствуйте,
возникла необходимость общаться двум программам с помощью STDIN, STDOUT.

Подскажите как передать hash, и получить в другой программе.

передаю так
Код

store_fd \%color, \*STDOUT;


по логике получать должен
Код

fd_retrieve \%table, \*STDIN;


но у меня есть проблема. в другой программе STDIN я получаю уже как строку. и Storable пишет , что на входе не GLOB. Как быть?
Есть ли что-то типа
Код

fd_retrieve \%table, $string;

?

Автор: ginnie 26.8.2008, 17:03
Уважаемый shamber, попробуйте http://search.cpan.org/~gaas/IO-String-1.08/String.pm.

Автор: vadiml 26.8.2008, 18:03
shamber

вы пытаетесь передать указатель на хеш в другую программу, а т.к. у неё своё адресное пространство, то ваш указатель в программе-получателе ничего не значит (да и вообще perl весьма активно зачищает за собой память -- даже если просто указатель сохранить указатель как строку и выйти за пределы блока существования самого объекта, объект моментально уничтожается)

переведите хеш в дамп и передайте его как строку, например как указано выше посредством IO::String, а в программе получателе восстановите хеш из дампа.

Автор: ginnie 26.8.2008, 18:09
Уважаемый vadimlshamber уже использует модуль Storable для сериализации хэша, проблема у него в том, что в другой программе ему необходимо сделать десериализацию, но вместо файлового дескриптора у него там строка, а Storable требует файловый десткриптор. 

Автор: gcc 26.8.2008, 19:06
Data::Dumper ?

Автор: arto 26.8.2008, 20:00
# perl -MStorable=store_fd -e 'store_fd { a => 1,b => 2,c => 3 },\*STDOUT' | perl -MStorable=fd_retrieve -MData::Dumper -e 'print Dumper fd_retrieve \*STDIN'
$VAR1 = {
          'c' => 3,
          'a' => 1,
          'b' => 2
        };

Автор: sir_nuf_nuf 26.8.2008, 20:30
Если говорим о Storable, то можно использовать freez и thaw для сериализации в строку

Автор: shamber 26.8.2008, 21:28
sir_nuf_nuf,
 freeze и thaw сериализируют в память, мне казалось(хоть и не проверял), что у разных скриптов разная память.

Добавлено @ 21:35
ginnie, спасибо, я думаю это то что нужно.

ЗЫ, щас какой-то глюк был и у меня в сообщении  ginnie превратилось в [Б]гинние[/Б]

Автор: sir_nuf_nuf 26.8.2008, 22:30
shamber,  freez сериализует в обычный скаляр. его можно передать через пайп.

Код

nuf@nuftop:~$ perl -MStorable -e 'print Storable::freeze({a => 1, b => 'howdy'})' | perl -MStorable -e '$/ = undef; $a = Storable::thaw(<>); print $a->{b}'
howdy


З.Ы. Этот глюк включается чекбоксом "Транслит", слева, чуть ниже смайликов =)

Автор: shamber 28.8.2008, 09:11
sir_nuf_nuf, спасибо за предложение. 

использовал вариант с thaw

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)