Можно ли открыть файловый дескриптор на основе канала, который печатает в переменную в Perl? - PullRequest
2 голосов
/ 19 апреля 2010

Я знаю, что могу это сделать,


------
open(F,">",\$var);
print F "something cool";
close(F);
print $var;
------

или это

 

open(F, "| ./prog1 | ./prog2 > tmp.file");
print F "something cool";
close(F);

а можно ли их объединить? Семантика того, что я хотел бы сделать, должна быть понятна из следующего:


open(F,"|./prog1 | ./prog2", \$var);
print F "something cool";
close(F);
print $var;

однако вышеприведенное явно не сработает.

Несколько минут экспериментов и поиска в Google, кажется, указывают на то, что это невозможно, но я хотел бы знать, застрял ли я с использованием `` для захвата вывода.

Ответы [ 5 ]

1 голос
/ 19 апреля 2010

Вы можете достичь своей цели несколькими способами. Ни один из них не так прост, как складывать лишние вещи в open.

Вы можете использовать IO :: Tee или другой подобный модуль, или даже написать собственную подпрограмму в стиле tee:

my $var ='';

open my $vh, '>', \$var or die "oh noes $!\n";
open my $ph, '| ./prog1 | ./prog2' or die "Uh oh $!\n";

my @handles = ($vh, $ph);

print_to_all( \@handles,
    "I like cheese.\n",
    "I like teas.\n",
);

print $var;    

sub print_to_all {
     my $handles = shift;

     for my $h ( @$handles ) {
         print $h @_;
     }

     return;
}

Другим способом было бы создать связанную переменную , которая одновременно работает как дескриптор файла и скаляр.

0 голосов
/ 31 мая 2010

То, что я на самом деле хотел сделать, невозможно в Perl.

0 голосов
/ 19 апреля 2010

Кажется, что это невозможно, поскольку perl не поддерживает 'pipe на обоих концах'. Больше информации здесь,

http://perldoc.perl.org/perlipc.html

Corion на perlmonks.org ответил на это для меня.

0 голосов
/ 19 апреля 2010
  • IPC::Open2 может помочь, см. man perlipc. Однако, скорее всего, вы заблокируете свою программу таким образом. Это безопасно, поскольку данные в конвейере меньше PIPE_BUF (в Linux 4096), записываются только один раз, а сторона записи немедленно закрывается после записи данных и до чтения результата.

  • Вы можете попытаться переписать вашу программу для разветвления так, чтобы в итоге вы получили: YourProg | ./prog1 | ./prog2 | YourProgForked.

  • В современном Linux вы можете использовать / dev / shm для размещения временного файла полностью в виртуальной памяти.

0 голосов
/ 19 апреля 2010

То, что вы хотите сделать, это открыть дескриптор файла, как у вас есть, прочитать содержимое переменной, добавить все, что вы хотите к этой переменной, а затем установить переменную окружения, как указано здесь на полную строка, которую вы только что сгенерировали.

Вы были почти там, и я надеюсь, что это поможет. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...