Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在需要其他脚本时将stdout重定向到变量_Perl_Stdout - Fatal编程技术网

Perl 在需要其他脚本时将stdout重定向到变量

Perl 在需要其他脚本时将stdout重定向到变量,perl,stdout,Perl,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 scrip

我正在尝试将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不会以任何方式更改标准文件描述符

谢谢

您需要修改文件句柄才能使其成为默认文件句柄(也称为
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;
您需要修改filehandle以使其成为默认filehandle(又名
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;

这对我来说很好。宏.pl中有什么?您应该使用只包含一条
print
语句的
macro.pl
来尝试它。并且始终
使用严格的
使用警告
!实际上,用不同的脚本替换它是可行的。是什么原因导致macro.pl的不同行为(这是一个相当繁重的脚本,需要其他脚本和运行系统命令,但其中没有一个重定向STDOUT)?您的输出指向哪里?它是否出现在控制台上?您确定
macro.pl
的输出没有发送到
STDERR
?您是否试图捕获通过
use
语句生成的输出,在这种情况下,您需要在代码重定向
STDOUT
周围设置一个
BEGIN
块。尝试在
macro.pl
的开头添加一个
print
语句,看看这是否会进入
$var
变量。1)输出会奇怪地消失。2) 运行脚本时,
STDERR
为空。3) 尝试在重定向周围使用
BEGIN
-仍然缺少输出。4) 尝试在macro.pl的开头添加打印-输出仍然为空。5) 这太奇怪了,谢谢你的帮助!:)这就是问题所在。系统启动一个有自己标准输出的新进程(尽管我的Unix不够好,无法知道新标准输出在哪里打开)。如果您使用
system
而不是
do
运行问题中的程序,那么您的输出将以同样的方式消失。我建议您使用
print qx/script\u name.pl/
而不是
system
。这样子脚本的输出由父脚本收集并打印到它自己的标准输出。宏.pl中有什么?您应该使用只包含一条
print
语句的
macro.pl
来尝试它。并且始终
使用严格的
使用警告
!实际上,用不同的脚本替换它是可行的。是什么原因导致macro.pl的不同行为(这是一个相当繁重的脚本,需要其他脚本和运行系统命令,但其中没有一个重定向STDOUT)?您的输出指向哪里?它是否出现在控制台上?您确定
macro.pl
的输出没有发送到
STDERR
?您是否试图捕获通过
use
语句生成的输出,在这种情况下,您需要在代码重定向
STDOUT
周围设置一个
BEGIN
块。尝试在
macro.pl
的开头添加一个
print
语句,看看这是否会进入
$var
变量。1)输出会奇怪地消失。2) 运行脚本时,
STDERR
为空。3) 尝试在重定向周围使用
BEGIN
-仍然缺少输出。4) 尝试在macro.pl的开头添加打印-输出仍然为空。5) 这太奇怪了,谢谢你的帮助!:)这就是问题所在。系统启动一个有自己标准输出的新进程(尽管我的Unix不够好,无法知道新标准输出在哪里打开)。如果您使用
system
而不是
do
运行问题中的程序,那么您的输出将以同样的方式消失。我建议您使用
print qx/script\u name.pl/
而不是
system
。这样子脚本的输出由父脚本收集并打印到它自己的标准输出。谢谢,但这不起作用。它甚至没有重定向STDOUT,这样程序就可以打印macro.pl输出,但是$printBuffer是空的。这很奇怪。它对我有用。你把代码换成这个了吗?我知道这是一篇老文章。但我一直在关注同样的问题。我试过这个。“我不为我工作。”戴维森看到博罗丁对这个问题的上述评论。谢谢,但这不起作用。它甚至没有重定向STDOUT,这样程序就可以打印macro.pl输出,但是$printBuffer是空的。这很奇怪。它对我有用。你把代码换成这个了吗?我知道这是一篇老文章。但我一直在关注同样的问题。我试过这个。“我不为我工作。”戴维森看到博罗丁对这个问题的上述评论。