【问题标题】:How can I redirect standard output to a file in Perl?如何将标准输出重定向到 Perl 中的文件?
【发布时间】:2010-09-23 15:21:53
【问题描述】:

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

我应该使用dup2() 的等价物吗?好像没找到

【问题讨论】:

  • 从 Perl 内部还是从命令行?什么操作系统?
  • 如果您的目标只是将程序的输出重定向为 exec ed 而子进程到目前为止没有做任何事情,那么这个问题不一定是 Perl-具体的;这是一个 shell 重定向的问题,或者在你调用它时使用你正在分叉运行的程序中内置的任何工具。例如exec("program > out.txt");.

标签: perl io-redirection


【解决方案1】:

从 perldoc -f 打开:

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

文档是你的朋友...

【讨论】:

  • 我以这种方式阅读了问题,即 OP 想要从父进程重定向孩子的 STDOUT。
【解决方案2】:

正如 JS Bangs 所说,重定向输出的一种简单方法是使用“选择”语句。
非常感谢 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"; 

【讨论】:

  • 不幸的是,这只在 perl 脚本内部有效。它不会重定向系统函数调用的命令的输出。
【解决方案3】:

子进程本身可以执行select $filehandle 来指定其所有print 调用都应定向到特定的文件句柄。

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

【讨论】:

    【解决方案4】:
    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";
    

    【讨论】:

    • 非常好的方法,但不幸的是,由于系统退出功能限制,不可能返回任何针对数字的文本。
    【解决方案5】:

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

    尽管几乎可以肯定有一种更优雅的方式来解决这个问题,具体取决于您尝试执行的操作的具体细节,但如果您绝对必须拥有dup2(),则它的 Perl 等效项存在于 POSIX 模块中。但是,在这种情况下,您处理的是实际文件描述符而不是 Perl 文件句柄,因此您只能使用 POSIX 模块中提供的其他函数,所有这些都类似于您在 C 中使用的函数。在某种程度上,你会用非常不符合 Perl 语言的 Perl 编写 C。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多