Perl 在需要其他脚本时将stdout重定向到变量
我正在尝试将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
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是空的。这很奇怪。它对我有用。你把代码换成这个了吗?我知道这是一篇老文章。但我一直在关注同样的问题。我试过这个。“我不为我工作。”戴维森看到博罗丁对这个问题的上述评论。