【问题标题】:How do I redirect eval output to a file?如何将 eval 输出重定向到文件?
【发布时间】:2017-05-30 17:40:40
【问题描述】:

我正在编写一个 Perl 脚本,我在其中读取包含 Perl 代码部分和非 Perl 数据的文件。

处理完文件后,我将它们写入一个临时文件(生成的脚本),然后使用eval 命令执行该文件。我不想单独运行生成的脚本,因为我需要使用主脚本中的变量在生成的脚本中进行插值。

我需要将 eval 命令的输出重定向到一个文件。关于如何实现这一点的任何建议?

脚本中的步骤:

  1. READ_FILE

  2. 处理文件

  3. 用临时文件名写回

  4. 读取临时文件 (my $file_name = read_file('temp_file_name'))

  5. 评估 (eval $file_name)

感谢您的帮助。

【问题讨论】:

  • 输出到STDOUT了吗?
  • 是的。它目前打印在 STDOUT 上。
  • 然后您可以使用 Capture::Tiny,将其放入变量中,然后从那里写入文件。周围有几个很好的答案。我会找到一个重复的目标。
  • stackoverflow.com/a/3511098/1331451 是基本的,我不认为它可以作为规范。 stackoverflow.com/a/8781408/1331451 更好,但不是公认的答案,所以我不想结束。我暂时写一个新的。
  • 为什么不只是openSTDOUT 上的文件?

标签: perl eval


【解决方案1】:

您可以使用Capture::Tiny 中的capture_stdout 来获取eval 的输出。

use strict;
use warnings;
use Capture::Tiny 'capture_stdout';

my $stdout = capture_stdout {
    eval q{print "Hello World!\n";};
};

open my $fh, '>', 'foo.txt' or die $!;
print $fh $stdout;

【讨论】:

    【解决方案2】:

    这可以在没有任何额外模块的情况下完成

    use strict;
    use warnings;
    
    open my $fh, '>', 'foo.txt' or die $!;
    my $old_fh = select $fh;
    
    eval q{ print "Hello World!\n"; };
    
    select $old_fh;
    

    【讨论】:

      【解决方案3】:

      TLDR 答案

      use Capture::Tiny;capture_merged()capture()。如果你喜欢它作为快捷方式,你可以使用capture_stdout()

      输出?哪个输出流? STDOUT 还是 STDERR?

      根据 Perl,输出的形式可以是:

      • STDOUT — 通常由 print() 等语句引起。
      • STDERR — 通常由 warn() 等语句引起。

      您可以使用 Capture::Tiny 将 STDOUTSTDERR 合并:

      my ($merged,  @result) = capture_merged { eval $codetoeval };
      

      或者,您可以使用 Capture:Tiny 将它们分开:

      my ($stdout, $stderr, @result) = capture { eval $codetoeval };
      

      如果您只想要这些形式的输出,您还可以选择capture_stdout()capture_stderr()。如果您只有print() 语句,那么capture()capture_stdout() 将给出相同的结果。

      完成演示

      use Capture::Tiny ':all';
      my $codetoeval = 'print "Hello, World!";';
      my ($merged,  @result) = capture_merged { eval $codetoeval };
      die "Merge Fail" if !@result;
      print("Output : " . $merged);
      open my $fh, '>', 'foo.txt' or die $!;
      print $fh $stdout;
      

      Full Working Online Demo at IDEOne

      输出:Hello, World!

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2012-06-26
        • 2017-04-04
        • 2012-01-11
        • 2011-11-01
        • 2018-05-02
        相关资源
        最近更新 更多