如何将标准输出重定向到Perl中的文件?

时间:2010-05-25 18:56:17

标签: perl io-redirection

我正在寻找使用Perl将stdout重定向到文件的示例。我正在做一个相当简单的fork / exec工具,我想将孩子的输出重定向到文件而不是父项标准输出。

我应该使用dup2()的等效项吗?我似乎无法找到它

5 个答案:

答案 0 :(得分:29)

来自perldoc -f open:

open STDOUT, '>', "foo.out"

文档是你的朋友......

答案 1 :(得分:6)

正如JS Bangs所说,重定向输出的一种简单方法是使用'select'语句 非常感谢stackoverflow及其用户。我希望这有用

例如:

print "to console\n"; 
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!";
select OUTPUT; $| = 1;  # make unbuffered
print "to file\n";
print OUTPUT "also to file\n";
print STDOUT "to console\n";
# close current output file
close(OUTPUT);
# reset stdout to be the default file handle
select STDOUT;
print "to console"; 

答案 2 :(得分:4)

子项本身可以select $filehandle指定其所有print调用都应指向特定的文件句柄。

父母可以做的最好的事情是使用systemexec或类似的东西进行shell重定向。

答案 3 :(得分:3)

open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
    open STDOUT, '>&', $fh;

    # do whatever you want
    ...

    exit;
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";

答案 4 :(得分:3)

一个严格的信息但不切实际的答案:

虽然几乎肯定会有更优雅的方式来实现这个,具体取决于你要做的事情的具体细节,如果你绝对必须有dup2(),那么它的Perl等价物会出现在{{1模块。但是,在这种情况下,您正在处理实际的文件描述符而不是Perl文件句柄,相应地,您只能使用POSIX模块中的其他提供的函数,所有这些函数都与您在C中使用的函数类似。在某种程度上,你会用非Perlish Perl写C.

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