Перенаправьте stdout к переменной, требуя другого сценария

Я пытаюсь перенаправить STDOUT к переменной, которая, кажется, хорошо работает. Однако, когда я требую другого сценария, его ожидаемая продукция не сохранена в той переменной.

my $var;

#save STDOUT for future redirect
open OLDOUT, '>&STDOUT';
close STDOUT;

# redirect STDOUT to $var 
open STDOUT, '>', \$var or die "Can't open STDOUT: $!";

# run the script that I'm supposed to catch its output
do("macro.pl");
close STDOUT;

# redirect STDOUT to its original FH
open STDOUT, '>&OLDOUT' or die "Can't restore stdout: $!";
close OLDOUT or die "Can't close OLDOUT: $!";

# print the expected result from macro.pl
print "$var";

Последняя линия не печатает ничего, которое не является ожидаемым результатом (бегущий macro.pl один урожаи непустая продукция).

Попробованный это также требует - тот же самый результат. Стоит упомянуть, что macro.pl не делает - в любом случае - изменяет стандартные дескрипторы файлов.

Спасибо!

0
nl ja de
На самом деле замена его с различным сценарием работает. какова может быть причина различного поведения macro.pl (это - довольно тяжелый сценарий, что требование других сценариев и бегущей системной команды, но не их перенаправляет STDOUT)?
добавлено автор Mattan, источник
1) Продукция странно исчезает. 2) STDERR пуст, управляя сценарием. 3) Испытанное использование НАЧИНАЕТ вокруг переназначения - все еще пропавшие без вести продукции. 4) Испытанное добавление печати в начале macro.pl - все еще пустая продукция. 5) Это становится странным, цените свою помощь!:)
добавлено автор Mattan, источник
Стоит упомянуть что, печатая в "родительском" сценарии (один I' ve процитировал свой код) после того, как переназначение, чтобы $var действительно экономит продукцию в $var. Только печатная продукция macro.pl (и его нижние индексы) отсутствует...
добавлено автор Mattan, источник
еще одна вещь: I' ve нашел что нижний индекс что его продукция doesn' t печатается, назван с помощью системой (script_name.pl) . вы думаете, что это имеет некоторое отношение к нему?
добавлено автор Mattan, источник
Огромное спасибо, которое решило проблему.:)
добавлено автор Mattan, источник
Это хорошо работает для меня. Что находится в macro.pl ? Необходимо попробовать его macro.pl , который содержит просто сингл печать заявление. И всегда использование, строгое и , используют предупреждения !
добавлено автор Borodin, источник
Куда ваша продукция идет в? Это появляется на пульте? Вы уверенный продукция из macro.pl isn' t, чтобы STDERR ? Вы пытаетесь захватить сделанный suring продукции использование заявление, в этом случае вам нужно , НАЧИНАЮТ , блок вокруг кода, перенаправляющего, STDOUT . Попытайтесь добавить печать заявление в начале macro.pl , чтобы видеть, идет ли это в ваш $var переменная.
добавлено автор Borodin, источник
Хорошо необходимо продолжать отлаживать. Попытка этого удаленно без вида кода isn' t действительно эффективный, но I' ll смотрят, если вы хотите поместить ваш macro.pl на a pastebin или подобный. Мой следующий шаг должен был бы добавить выход непосредственно после нового печать заявление, поскольку я подозреваю, что проблема в использование заявления.
добавлено автор Borodin, источник
Это - проблема. Система начинает новый процесс, у которого есть его собственный STDOUT (хотя мой Unix isn' t достаточно хороший, чтобы знать, где новый STDOUT открыт). Если вы управляете программой в своем вопросе с , система вместо делает тогда, ваша продукция исчезнет таким же образом. Я предлагаю, чтобы вы использовали печать qx/ script_name.pl/ вместо система . Тем путем продукция из детского сценария собрана родителем и напечатана к его собственному STDOUT.
добавлено автор Borodin, источник

1 ответы

Вы должны выбрать дескриптор файла, чтобы сделать его дескриптором файла по умолчанию (иначе STDOUT ). Попробуйте его как это.

my $printBuffer; # Your output will go in here
open(my $buffer, '>', \$printBuffer);
my $stdout = select($buffer); # $stdout is the original STDOUT

do 'macro.pl';

select($stdout); # go back to the original
close($buffer);

print $printBuffer;
3
добавлено
Спасибо, Но этот doesn' t работа. Это doesn' t даже перенаправляют STDOUT, такой, что программа действительно печатает продукцию macro.pl, но $printBuffer пуст.
добавлено автор Mattan, источник
That' s странный. Это работает на меня. Вы заменяли свой код этим?
добавлено автор simbabque, источник
@davison видят выше комментария Бородина по вопросу.
добавлено автор simbabque, источник
Я знаю, что это - старая почта. Но я преследовал ту же самую проблему. Я попробовал это. Я doesn' t работают на меня.
добавлено автор davison, источник
Modern::Perl
Modern::Perl
362 участник(ов)

Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.

use Perl or die;
use Perl or die;
164 участник(ов)

Группа о языке Perl и обо всём что с ним связано.

pro.perl
pro.perl
22 участник(ов)

Язык программирования Perl